home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ANIVGA.ZIP
/
ANIVGA.DIC
< prev
next >
Wrap
Text File
|
1992-08-16
|
110KB
|
3,595 lines
DoffsetXTiles:=(StartVirtualX-BackX1+15)DIV16
EoffsetXTiles:=(StartVirtualX-BackX1+15)DIV16
DoffsetYTiles:=(StartVirtualY-BackY1+15)DIV16
EoffsetYTiles:=(StartVirtualY-BackY1+15)DIV16
DoffsetXTiles:=(StartVirtualX-BackX1+15) DIV 16
EoffsetXTiles:=(StartVirtualX-BackX1+15) DIV 16
DoffsetYTiles:=(StartVirtualY-BackY1+15) DIV 16
EoffsetYTiles:=(StartVirtualY-BackY1+15) DIV 16
Dbottomcut:=(ypix-200) AND $F
Ebottomcut:=(ypix-200) AND $F
D(0,y) =
E(0,y) =
DDI:=y*LINESIZE+(0 div 4)=y*LINESIZE
EDI:=y*LINESIZE+(0 div 4)=y*LINESIZE
DLINESIZE
ELINESIZE
DStatusReg
EStatusReg
D"AND $FFF0" kann dabei entfallen, da in BackX1
E"AND $FFF0" isn't needed, because in BackX1, the
Dsqrt
Esqrt
DBX:=hoehe (fuer spaeter)
EBX:=height (to be used later)
DName des zu ladenden Palette-Files (Typ: "*.PAL" )
Ename of the palette file (type: "*.PAL") to load
Dakt_SpriteX
Eakt_SpriteX
D--- "Abkuerzung" ueber WriteMode 1 moeglich!:
E--- short-cut possible, using write mode1:
D--- "Abkuerzung" ueber WriteMode 1 moeglich!
E--- short-cut possible, using write mode1
Detwas spaeter wird dann DS (ES) = Segment der Spr.daten von Spr.1 (2)
Ea little bit later DS (ES) will be set to segment of spr. 1 (2) data
Dd.h.: sie ist nur fuer einen Animationszyklus sichtbar (soll sie
Eimage, that is: it will be visible only for one animation cycle (if
D(BackX1,BackY1), (BackX2,BackY2) = auf 16er Raster gerundete Koord.
E(BackX1,BackY1), (BackX2,BackY2) = coordinates, rounded to 16-grid
Dmuss im Stapel liegen (da DS andersweitig belegt wird!
Emust be in stack (DS will be used for other purposes!
Dauf 16er Raster gerundete Koord.
Ecoord., rounded to 16'grid
Dzuerst Linie auf sichtbaren Bereich zurechtklippen; dazu Sutherland-
Efirst clip line to visible window; use Sutherland-Cohen-algorithm:
Dmuss im Stapel liegen (da DS andersweitig belegt wird!)
Emust lie in stack (because DS is used for other purposes!)
DSegment_Adr
ESegment_Adr
DVersionsnummer
Eversion number
DBei Uebergabe von NIL als Zeiger stellt die Routine gar nicht dar;
EWhen supplying NIL as pointer, the routine won't display anything
Dgegen die der Farbtabelle "ShadowTab" ersetzt (um bspw. Schatten zu er-
Ethose of the color lookup table "ShadowTab" (e.g.: to realize shadows,
Dseite ab, beginnend mit der uebergebenen Nummer number
Epage, starting with the given number "number"
DDer Punkt wird NICHT automatisch in den Hintergrundspeicher ueber-
EThe pixel will NOT automatically be overtaken into the background
DBei Uebergabe von NIL als Zeiger stellt die Routine gar nichts dar
EIf you supply NIL as pointer, the routine will display nothing
Dnegativer
Enegative
Dzeigt genau hinter den Header
Epoints exactly behind the header
Dbester Naeherungswert fuer "newColor"
Ebest fit for "newColor"
Dkein Treffer in X-Richtung -> ueberhaupt kein Treffer!
Eno collision in X-direction -> no collision at all!
DZeilenzaehler
Erow counter
Dkeitsanpassung an unterschiedlich schnelle Rechner, ...
ECPU-clocks, ...
Dzeilenadr
Ezeilenadr
Daeusserer Schleifenzaehler
Eouter loop-counter
Drem: Alle nicht ueberschriebenen Farben werden in "pal" auf die Werte der
Erem: All entries in "pal" which get not overwritten by the file's contents
D2..3 DW Plane_1_Daten
E2..3 DW offset_ptr_to_plane1_data
Dof FadeIn
Eof FadeIn
DOffsetanteil des Zeigers zu den Planeadr. addieren
Eadd pointer's offset part to the plane address
D- flickerfreie Animation durch page-flipping, Auswertung des vertikalen
E- flickerfree animations by using page-flipping, vertical retrace infor-
Dist es ein Farbbildschirm?
Eis it a color display?
DLES DX,Ziel ;nach ES:DX
ELES DX,Ziel ;to ES:DX
D#4
E#4
D14.
E14.
DINT 10h
EINT 10h
D3BAh/3DAh = Status-Register fuer monochrom/Farbe
E3BAh/3DAh = state register for monochrome/color
D3B4h/3D4h = CRTAddress-Register fuer monochrom/Farbe
E3B4h/3D4h = CRTAddress-register for monochrome/color
DES
EES
DDS
EDS
Dzu movende Zeile
Erow to move
DQuelladresse
Esource address
Dzu je
E,
Dwurde:
Eroutines above:
DFuer den ersten Animationszyklus nach Aufruf dieser Routine
EBecause of TimeFlag:=$80, the timing mechanism won't work
Dfuer "leere Spalte"?
Efor "empty column"?
Dauch 2.Sprite pruefen: "leere Spalte"?
Echeck 2nd sprite too: "empty column"?
Dfuehrt wird, wenn leftcut mod 4=0, also 16+3-leftcut=...11b, die
Eonly be run if leftcut mod 4=0, thus 16+3-leftcut=...11b, the
DFuellfarbe fuer die Seite
Ecolor with which to fill the page
Dd.h.: "Rechner ist ein PC" vorgetaeuscht. Sonst ist IsAT=0
Ethe routine will fake "computer is a PC". Else IsAT=0
Dzu setzende Palette
Epalette to be set
DAX = endy*max_breite_in_4er =yoffset
EAX=endy*max_width_in_groups_of_4=yoffset
Dmin(a,b)
Emin(a,b)
DVerwaltung von bis zu 1000 verschiedenen Sprites
EManages up to 1000 different sprites
Dberechne relativen X-Abstand vom linken Rand des
Ecompute relative X-distance from left edge of
Dseite), zeichnet alle sichtbaren Sprites, synchronisiert auf das dis-
Einformation), draws all visible sprites, synchronizes to the display-
Djede Zeile dabei in der Reihenfolge von links nach rechts
Eeach row from left to right
Dwelcher Hintergrundmodus?
Ewhich background mode?
Dletztes Sprite zeigt auf erstes
Elast sprite points to first one
DFehlercodes des Animationspaketes:
Eerror codes of the animation package:
DDefaultwerte entsprechen Abdunkelung auf 70% des Farb-Helligkeitswerts
Edefault values correspond to a darkening to 70% of the original brightness
DDefaultfarben-Palette des 256-Farbmodus
Edefault palette colors of 256color mode
DFeatures:
EFeatures:
DRetracesignals und Verwendung eines speziellen VGA-256-Farbengrafikmodus
Emation and a special "tweaked" VGA-256-color graphicmode
Dlen = Laenge des zu definierenden Spritezyklus
Elen = length of your sprite cycle
DtempColors
EtempColors
DError
EError
Dist das ein AT/386? ($0/$80=ja/nein)
Eis this an AT or better? ($0/$80=yes/no)
Dx+15-xmax
Ex+15-xmax
Dy+15-ymax
Ey+15-ymax
DShadowTab = (Naeherungs-)Farbtabelle fuer gewuenschte Abdunkelung
EShadowTab = (best approximation) color table for wanted dimming
D[dec(startx,bildschirmstartx)
E[dec(startx,ScreenStartX)
Dout: Anzahl der aus dem File gelesenen Farben (0 = Fehler trat auf)
Eout: number of colors read from the file (0 = an error occured)
Dzum Bsp.: xxrxxxxx, mit: r=rot=40, g=gruen=45, b=blau=35, x=weiss=30
Efor ex.: xxrxxxxx, with: r=red=40, g=green=45, b=blue=35, x=white=30
Dx2last
Ex2last
Dy2last
Ey2last
D22..23 DW ? ; bildx | hit2xfirst
E22..23 DW ? ; bildx | hit2xfirst
Dleft
Eleft
Djetzt
Enow
Dleft_to_right
Eleft_to_right
DDer Inhalt der Seite "pa" wurde auf die Seite 1-PAGE kopiert
Ethe contents of page "pa" has been copied to page 1-PAGE
Dseite), zeichnet alle sichtbaren Sprites, synchronisiert auf das vert.
Eimage), draws all visible sprites, synchronizes to the vertical
DNextSprite[nr] bis NextSprite[nr+len-1] wurden so gesetzt,
ENextSprite[nr] through NextSprite[nr+len-1] have been set
Ddeshalb: AH:=Kachel und anschliessend AX um 2 Bit
Etherefore: set AH:=tile and afterwards, shift AX
Dgesetzt werden; hier der Einfachheit immer neugesetzt
Efor simplicity, we always reset it here
Dzelnes Sprite oder eine ganze Spritebibliothek handelt und laedt
Etains a single sprite or a complete sprite library and loads all
DUeberpruefung statt!
Edoesn't make any checks!
Dkein Clipping statt
Eno check for that
Dgesetzt, eine evtl. noetige Leseplane dagegen nicht!
Eready been set, but not that for the evtl. needed read plane!
Dgegebenen Grafikseite gefuellt.
Etents of the supplied graphic page.
DVerschiebung um 3 Bit:
Edisplacement of 3 bit:
DVerschiebung um 2 Bit:
Edisplacement of 2 bit:
DVerschiebung um 1 Bit:
Edisplacement of 1 bit:
Dselbstgestrickter 6x6 Font
Eselfmade 6x6 font (ugly..)
DRest wie gehabt
Erest as above
DDer Punkt (x,y) wurde in absolute Bildschirmkoordinaten umgerechnet
EThe point (x,y) has been transformed to absolute screen coordinates
DDer Punkt (x,y) wird zunaechst auf 16er Raster gebracht!
EThe point (x,y) first gets rounded to a grid with mesh 16
DDer Bildausschnitt wurde zur Bildschirmdarstellung zurechtgeklippt
EThe cutting has been properly clipped before being displayed
DDer benoetigte Speicher wird von der Routine automatisch reserviert
EThe memory needed will be reserved by the routine automatically
DZeiger auf Heapbereich, der den kopierten Bildausschnitt enthaelt
Epointer to heap address where the copied screen area is stored
Dneue Farbe=alte, abgedunkelt auf "brightness" Prozent:
Enew color=old one, darkened to "brightness" percent:
Dnein, keine moeglich oder nicht gewuenscht
Eno, none possible or not wanted
DJetzt ueberpruefen, ob gesetzte Zyklus(mindest)zeit abgelaufen ist:
ECheck whether the preset (min.) cycle time has passed:
DJetzt obere rechte Eck-Kachel - falls nicht schon gezeichnet:
ENow the upper right corner-tile - if not already drawn:
DJetzt die untere rechte Tile - falls sie nicht bereits schon gezeichnet
ENow draw the lower right tile - if it doesn't have been drawn by one of
DFehlerwert
Eerror value
DZeiger auf (durch GetImage erstellten) Bildausschnitt
Epointer to the cutting (returned by GetImage)
Dleftcut
Eleftcut
Dneue Helligkeit
Enew brightness
DSetShadowTab(Schatten) kann entfallen, da Defaultwerte schon gesetzt!
ESetShadowTab(Schatten) isn't needed, as the default values are set already
Dwrap-around, deshalb: Adresse um 1 erhoehen, was
Ewrap-around, thus: increment address by 1, which
Dbreite,hoehe und Teile oberhalb des Bildschirms
Ewidth,height and parts above the screen
DBreite,Hoehe des def. Bereiches
Ewidth, height of defined area
DGroesse einer Zeile=80 Bytes
Esize of one row=80 bytes
Dnr = Spriteladenummer des ersten Sprites des Zyklus
Enr = spriteloadnumber of the first sprite in the cycle
Dbrightness
Ebrightness
DSI
ESI
DDI
EDI
DSchaltet die VGA-Karte in den 320x200x256x4-Modus; ACHTUNG!
Eswitches the VGA-card into 320x200x256x4-mode; ATTENTION!
Dypix:=(16-StartVirtualY) AND $F
Eypix:=(16-StartVirtualY) AND $F
Dxpix=rightcut:=(16-StartVirtualX) AND $F
Expix=rightcut:=(16-StartVirtualX) AND $F
D1 Byte plus Length(PICHeader) als Kennung
E1 byte plus length(PICHeader) as tag
DAuf "display enable"=0 (d.h.: aktiv) warten, so dass Seitenumschaltung
EWait for "display enable"=0 (that is: active), so that page flipping
Dmuss zwischen 0 und 15 liegen, 16 ist erlaubt (aber unsinnig)!
Emust lie between 0..15, 16 is allowed (but senseless)!
Dzu je 1 Byte plus Length(PICHeader) als Kennung
Eat 1 byte each, plus length(PICHeader) as tag
Dnur diese 3 Modi sind zulaessig
Eonly these 3 modes are allowed
DFuer Maskenadressierung
EFor mask addressing
Dmuss Werte zwischen 0..15 haben, 16 ist unzulaessig!
Emust have a value in the range 0..15, 16 is not allowed!
Dauszugebender Textstring
Etextstring to be displayed
Dmuss zwischen 0 und 15 liegen, 16 ist erlaubt (aber unsinnig)
Emust lie in the range 0..15, 16 is allowed (but senseless)
Dnur diese 4 Modi sind zulaessig
Eonly these 4 modes are allowed
Dgute Parameter sind z.B. Summen von Zweierpotenzen +1
Ee.g., good values are sums of powers of 2 +1
Dauch nach [@Starty_2+1]
Estore it in [@Starty_2+1], too
Dsichtbare) Grafikseite, auf die gezeichnet wird
Evisible) graphic page on which to draw
DWie OutTextXY(), aber es wird in den Hintergrund geschrieben und
EFunctionally equivalent to OutTextXY(), but the text will be
DLiegt der Punkt ausserhalb des sichtbaren Bereichs, so wird
EIf the pixel lies outside the visible window, the routine
Deintragen: CX=HIGH-Word, DX=LOW-Word
Eseconds: CX=HIGH-Word, DX=LOW-Word
DDie Anwendung dieser Routine ist nur fuer den Hintergrund-
ECalling this routine only makes sense when using SCROLLING
DDie Anwendung dieser Routine ist natuerlich nur fuer den Hintergrund-
EObviously, calling the routine only makes sense when using SCROLLING
Dmin(a,b)>=max(c,d) ?
Emin(a,b)>=max(c,d) ?
Dlinke obere Ecke des Bereiches (virtuelle Koord.)
Eupper left corner of the area (in virtual coord.)
DFilename fuer das zu ladende Bild
Efile name for the picture to load
DFilename fuer das abzuspeichernde Bild
Efile name for the picture to store
DFilename fuer das zu ladende Hintergrundbild
Efile name for the background picture to load
DFilename fuer das abzuspeichernde Hintergrundbild
Efile name for the background picture to store
DBit 6:=1: Adressierung des Speichers=lineares Bitfeld
Ebit 6:=1 -> address memory as a linear bit array
DCL=0/1 fuer offscreenFlag=false/true=(yt<0) OR (yt>=YTiles
ECL=0/1 for offscreenFlag=false/true=(yt<0) OR (yt>=YTiles)
DCL=0/1 fuer offscreenFlag=false/true=(yt<0) OR (yt>=YTiles)
ECL=0/1 for offscreenFlag=false/true=(yt<0) OR (yt>=YTiles)
DGraphTextBackground=Farbe fuer Texthintergrund;ist dieser Wert
EGraphTextBackground=color to be used for text background; if
Dorand1+2*hit1xfirst
Eorand1+2*hit1xfirst
DGrafikseite "pa" wurde mit der Farbe "Color" gefuellt
Egraphic page "pa" has been filled with color "Color"
Derste Zieladresse ist
Efirst dest. addr. is
DError wurde gesetzt, falls keine VGA-Karte im System enthalten ist
EError has been set, if no VGA-card could be found in the system
DTrick, da der Assembler nicht mit dem SS-Segment klarkommt
Etrick, as the assembler messes up accesses to the SS-segment
D1.Zeile zeichnen
Edraw 1st row
Ddto. fuer gruenen Farbanteil...
Edto. for green color part...
Dxtil
Extil
Dytil
Eytil
D; Bereich:
E; variables: ("a|b" = used for a and b)
D0128: CLD
E0128: CLD
D...und fuer den blauen Anteil auch
E...repeat computation for blue part
DNun alle anderen oberen Kacheln, die nur oben (aber nicht seitlich)
ENow work on all other upper tiles, which are cut at their top (but
DAuch hier gilt, dass der gezeichnete Punkt NICHT automatisch
EAgain, the drawn pixel will _NOT_ automatically be taken
Dpunkte, deren Farbe <>0 ist beruecksichtigt: die Hintergrundfarbe, die sich
Epixels with color <>0 will be processed: the background color, which is
Dout: (BackX1,BackY1), (BackX2,BackY2) =
Eout: (BackX1,BackY1), (BackX2,BackY2) =
DQuellzeiger:=sprite[WORD PTR (licutoff_in_Punkten+0 AND 3)*2
Esource pointer:=sprite[WORD PTR (lecutoff_in_points+0 AND 3)*2
DPunkt1 unterhalb von Punkt2 ?
Epoint1 below point2 ?
DPunkt1 rechts von Punkt2 ?
Epoint1 right of point2 ?
D16 horizontale Punkte = 4 Bytes pro Zeile
E16 horizontal pixels = 4 bytes per line
DBildschirmmitte
Emiddle of screen
DEinschub Ende
Eend of insertion
Dsichtbare Grafikseite
Evisible graphic page
Dsichtbare Seite
Evisible page
Dtime
Etime
Dvirtuelle
Evirtual
DDie Bitmap-Grafik in der Datei "name" wurde in die Hintergrundseite
EThe bitmap-picture contained in file "name" has been loaded to the
Dfieser Trick: "CALL Modus2Work" wuerde (da re-
Esort of hack: "CALL Modus2Work" would be coded
Deinbeziehen (plus 4 Bytes zum ueberspringen von "breite" und "hoehe"
Eleft cutoff (+4 bytes to jump over "breite" (width) and "hoehe" (height)
DBitplanes/-breiten in der richtigen Reihenfolge
Esource bitplanes/-widths in the correct order
DSinnvoll sind nur die Seiten 0 oder 1, es findet aber keine
ESensible page values are only 0 or 1 here, but the routine
Dnicht in die durch PAGEADR spezifizierte Seite!
Ewritten to the background page instead of page PAGEADR!
Ddiese Routine VOR dem Aufruf von ANIMATE auszufuehren, da dann alle
Ewill call this routine BEFORE calling ANIMATE, because this way, all
DDies hilft fuer eine direkte Uebernahme der von GetImage gelie-
EThat is useful when you are going to use the routine directly on
Dsichtbar ist immer die nichtaktuelle Grafikseite
EALWAYS is the non-actual graphic page the visible one!
Ddie Zieladresse
Ethe destination address
Ddie Quelladresse
Ethe source address
Dlinke
Eleft
Dlinke obere Ecke der zu zeichnenden Tile
Eupper left corner of the tile to be drawn
Dlinke obere Bildschirmecke
Eupper left image corner
DDiese Datei ist 4*PAGESIZE+3 = 64003 Bytes gross: 320x200 Punkte
EThis file has size 4*PAGESIZE+3 = 64003 bytes: 320x200 points
DHintergrundseite(nadresse)
Ebackground page(address)
DDisplay_UNKNOWN, wenn das Sprite noch nicht geladen wurde!
EDisplay_UNKNOW, if the sprite hasn't been loaded, yet!
D--- falls Abkuerzung genommen wurde, muss WriteMode 0 wieder
E--- if short-cut has been taken we must restore write mode 0
D*4 = Breite in Punkten
E*4 = width in points
D44..45 DW rechte_Begrenzungen
E44..45 DW offset_ptr_to_right_boundary_data
D...gefolgt von der Hoehe, danach dann die Daten
E...then store height, followed by the data
Dwg. actIndex=yt*XTiles+xt auch actIndex erhoehen
Ebecause actIndex=yt*XTiles+xt do increment actIndex, too
DFOR true_radius:=1 TO k STEP 1/adjust ist in Pascal leider nicht moeglich!
Eunfortunately, FOR true_radius:=1 TO k STEP 1/adjust isn't possible in TP
Dnur Seiten 0..3
Eonly pages 0..3
DDX=ueberhang:=xmax-(SpriteX+endx)
EDX=overhang :=xmax-(SpriteX+endx)
DAX=bildschirmstartx:=SpriteX+startx
EAX=ScreenStartX:=SpriteX+startx
Dsichtbar! (Deshalb ist es sinnvoll, diese Routine NACH Aufruf
E(For that reason, you should call this routine AFTER
DBitmaske fuer Zugriff
Ebitmask for access
D- volle Unterstuetzung der 256-Farbmoeglichkeiten der VGA-Karte
E- full use of the VGA's 256-color mode
Dtiles:=19+ord(leftcut=0)
Etiles:=19+ord(leftcut=0)
Ddie erste Zieladresse ist DI:=0*LINESIZE+(0 div 4)=0
Ethe first dest. addr. is DI:=0*LINESIZE+(0 div 4)=0
DoffsetXTiles
EoffsetXTiles
DoffsetYTiles
EoffsetYTiles
DBACKGNDPAGE geladen
Ebackground page BACKGNDPAGE
Ddto. fuer Abstand der y-Koordinate vom oberen
Edto. for distance between the y-coordinate and
DStartplane anwaehlen
Eselect start plane
Ddto. fuer Planebreiten:
Edto. for plane widths:
Ddto., oben
Edto., at the top
Ddto., unten
Edto., bottom
D15
E15
D#5
E#5
D15.
E15.
DEinschub fuer Zeitbedingung:
Einsertion to realize timing:
DRichtung
Edirection
DDiese Prozedur sollte einmal - ganz zu Beginn - zur Initialisierung
EThis procedure should be called only once - namely in the very
Dtine fuehrt dabei selber alle notwendigen Umrechnungen und Clipping-
Eself takes care of coordinate transformations and evtl. necessary
DHierher kommt die Routine zur Datenuebertragung!
Ethis is the address where the data transfer routine will be patched!
DTimeFlag
ETimeFlag
D26..27 DW ? ; end_min_start | ueberlappx_1
E26..27 DW ? ; end_min_start | ueberlappx_1
Dueberlappx
Eueberlappx
D1 Pixel=1 Byte; dazu: 2 Woerter fuer breite & hoehe
E1 pixel=1 byte; add 2 words for width & height
Dlirand1
Elirand1
DWindowX1
EWindowX1
Dzielzeiger:=(bildschirmstartx+1)
Edest. ptr :=(ScreenStartX+1)
Dminx-maxx-1=-(maxx-minx+1)
Eminx-maxx-1=-(maxx-minx+1)
Dsichtbare Breite dieser Zeile -1
Evisible width of this row -1
Ddto.
Edto.
Ddto.,
Edto.,
DSinnvoll sind nur die Seiten 0,1 und BACKGNDPAGE, jedoch
EOnly "pa" values of 0,1 and BACKGNDPAGE make sense, but
DDie li. obere Ecke wird nach links oben gezogen, die re. untere nach
EThe upper left corner will be torn to the upper left, the lower
DBit 7 = 0/1 fuer Zeit ist abgelaufen/laeuft noch
Ebit 7 = 0/1 for delay completed/not yet completed
Deinfaches horizontales und vertikales Scrolling moeglich
Esimple creation of horizontal/vertical "scrolling" applications
D36..37 DW ? ; | y2
E36..37 DW ? ; | y2
Dueberlappy
Eueberlappy
Dlirand2
Elirand2
DZielseite, in die das Bild geladen werden soll (0..2)
Edestination page to be loaded with the picture (0..2)
DZielseite, in die das Bild geladen werden soll (=2)
Edestination page, in which to load the picture (=2)
Dxrgrxxxx
Exrgrxxxx
DSHR
ESHR
Dist SCROLLPAGE ebenfalls erlaubt
ESCROLLPAGE is allowed, too
DEs wurde auf die Darstellung der Grafikseite pa umgeschaltet
EThe display has been switched to graphic page pa
DEs werden die Defaultfarben des Modus $13 gesetzt!
EThe default colors of mode $13 will be set!
Dauf den zurueckgeschaltet werden soll
Eto which we'll switch back
Ddung der Routine nur fuer den Hintergrundmodus STATIC sinnvoll!
Etine only makes sense when using background mode STATIC!
Dzu zeichnende Zeilenzahl
Enumber of rows to draw
Dzu zeichnende Zeilenanzahl
Enumber of rows to draw
DNummer, die das erste Sprite aus diesem File bekommen soll
Enumber for the first sprite of this file
Dfuer Gruenanteil
Efor green part
Dfuer Blauanteil
Efor blue part
DNummer, die die erste Farbe aus diesem File bekommen soll
Enumber for the first color being read in from the file
D16..17 DW SpriteLength ; Laenge der Spritedatei
E16..17 DW SpriteLength ; length of this sprite in bytes
Dti
Eti
Dhierher, wenn heller: maximale Abwei-
Ejump here, if brighter: return max.
DDie Linie wird NICHT sofort sichtbar, sondern erst im naechsten Ani-
EThe line will NOT be visible until the next animation cycle takes
Dverwendeter Zeichensatz:
Eused font:
DBX=[zeilenadr] = (endy+SpriteY)*LINESIZE
EBX=[zeilenadr] = (endy+SpriteY)*LINESIZE
Ddie Seite, die gefuellt werden soll (0..3)
Ethe page which shall be filled (0..3)
DBitplane (0..3) (=X-Koordinate AND 3)
Ebitplane (0..3) (=X-coordinate AND 3)
DZeiger auf 1. (2.) Sprite in ?WRTD[..] ,
Epointer to 1. (2.) sprite in ?WRTD[..] ,
DPseudoprozedur, um Daten der Farbumsetztabelle im Codesegment unterzu-
EPseudo-procedure to store the color lookup table into the code segment
D4..5 DW Plane_2_Daten
E4..5 DW offset_ptr_to_plane2_data
Dihren ersten zwei Bytes paarweise verschieden sein!
Ewise disjoint in their first two bytes!
Dthen
Ethen
DShadowTab neu/nicht neu berechnen
Erecompute/don't recompute ShadowTab
Dfuer: Zeit laeuft noch/ist um
Efor: delay still lasts/has ended
D16 horizontale Punkte = 4 Bytes pro Zeile: BX:=4
E16 horizonzal points = 4 bytes per row: BX:=4
Ddie erste Zieladresse ist DI:=y*LINESIZE+(x div 4)
Ethe first destination addr. is DI:=y*LINESIZE+(x div 4)
DDie erste Zieladresse ist DI:=0*LINESIZE+(x div 4) = x div 4
EThe first destination address is DI:=0*LINESIZE+(x div 4)=x div 4
DSegment_Adr[1-PAGE]
ESegment_Adr[1-PAGE]
Dzeilenadr:=(endy+SpriteY)*LINESIZE
Ezeilenadr:=(endy+SpriteY)*LINESIZE
Dneuer PAGEADR-Wert := Segment_Adr[PAGE]
Enew PAGEADR-value := Segment_Adr[PAGE]
DDrawUpperTile(x,topcut:INTEGER; index:WORD);
EDrawUpperTile(x,topcut:INTEGER; index:WORD);
DDrawUpperRightTile(x,rightcut,topcut:INTEGER; index:WORD);
EDrawUpperRightTile(x,rightcut,topcut:INTEGER; index:WORD);
DDrawUpperLeftTile(leftcut,topcut:INTEGER; index:WORD);
EDrawUpperLeftTile(leftcut,topcut:INTEGER; index:WORD);
DDrawRightTile(x,y,rightcut:INTEGER; index:WORD);
EDrawRightTile(x,y,rightcut:INTEGER; index:WORD);
DDrawLowerTile(x,y,bottomcut:INTEGER; index:WORD);
EDrawLowerTile(x,y,bottomcut:INTEGER; index:WORD);
DDrawLowerRightTile(x,y,rightcut,bottomcut:INTEGER; index:WORD);
EDrawLowerRightTile(x,y,rightcut,bottomcut:INTEGER; index:WORD);
DDrawLowerLeftTile(y,leftcut,bottomcut:INTEGER; index:WORD);
EDrawLowerLeftTile(y,leftcut,bottomcut:INTEGER; index:WORD);
DDrawLeftTile(y,leftcut:INTEGER; index:WORD);
EDrawLeftTile(y,leftcut:INTEGER; index:WORD);
DDrawInnerTile(x,y:INTEGER; index:WORD);
EDrawInnerTile(x,y:INTEGER; index:WORD);
DSHORT
ESHORT
Dist diese Routine bereits aktiv?
Eis this routine already active?
D1.Zeile, in der Sp.1 mit Sp.2 ueberlappt
E1st row where sprite1 overlaps sprite2
D1.Zeile, in der Sp.2 mit Sp.1 ueberlappt
E1st row where sprite2 overlaps sprite1
D- gleichzeitige Darstellung von bis zu 500 Sprites
E- up to 500 sprites may be simultaneously active
DStandardpalette setzen, sicher ist sicher
Eset default palette, just to be sure!
D15, d.h.: weiss (dto.)
E15, that is: white (dto.)
DLB der neuen Startadresse setzen
Eset LB of new starting address
DHB der neuen Startadresse setzen
Eset HB of new starting address
Dauf naechste Zeile positionieren:
Eposition at next row:
DQuellzeiger weitersetzen
Eincrease source pointer
Drueckwaerts moven!
Emove backwards!
DQuelldaten
Esource data
Dzu minmieren)
Eminimize the squared error)
DOutput-Register befragen:
Euse output register:
DMuster zugewiesen
Epattern
Dzu minimieren)
Eminimize the square of errors!)
Dnur falls x mod 4=0 _und_ rightcut mod 4=0 ist koennen
Eonly if x mod 4=0 _and_ rightcut mod 4=0, then we can
DNun folgen die Codestuecke, die Verwendung finden, um ein Sprite auf den
ENow, all the code pieces follow, which can be used to display a sprite;
Dzur (Offset-)Quelladresse in Page 3 addieren
Esource addr. in page 3 for each cut off top-row
DZunaechst den Spriteheader einlesen:
Efirst, read in the sprite header:
Dzuerst das Hintergrundbild auf die aktuelle Seite kopieren:
Efirst copy the background picture to the actual graphic page:
Dzu zeichnende Zeilenzahl nach BX retten
Esave number of rows to draw into BX
DQuell- und Zieladresse nicht mehr retten
Edon't save source- and destination addresses
DQuell- und Zieladresse fuer weitere Planes retten
Esave source- and destination address for other planes
DQuellzeiger um 1 Grafikzeile weitersetzen
Eincrement source pointer by 1 graphic row
DPunkt setzen
Edraw point
Dnur falls x mod 4=0 ist koennen wir WriteMode1 verwenden
Eonly if x mod 4=0 is it possible to use WriteMode1
Dnur falls leftcut mod 4=0 ist koennen wir WriteMode1 verwenden
Eonly if leftcut mod 4=0 is it possible to use WriteMode1
Dnun fuer diese Farbe eine moeglichst gute Naeherung finden:
Enow find the best fit for that color:
DNun eigentliches Clipping vornehmen:
ENow do the clipping itself:
Dfuer Stringbefehle die Zieladresse nach DI bringen
Eput dest. addr. into DI for 8086's string instructions
Dzu zeichnende Zeilen
Erows to draw
DAusschnitt auf Bildschirm zurechtklippen:
Ecut clipping according to visible screen:
Dmuss zwischen 0 und 15 liegen, 16 ist verboten
Emust lie in the range 0..15, 16 is not allowed
DAusserdem muessen die einzelnen Routinen zur Unterscheidbarkeit in
EBesides that, for distinguishtability, the routines must be pair-
Dfuer gruen
Efor green
DQuell-/Zieldaten beide mit nur 1 Indexregister ansprechen
Eaddress source and destination with only 1 index register
DZugriff auf Leseplane vorbereiten:
Eprepare access to read plane:
D...und Zugriff auf alle 4 Bitmaps erlauben
E...and allow access to all 4 bit maps
Deine andere Routine zur Darstellung des Sprites als die gerade ak-
Emomentary active sprite display method is needed; if so, then copy
DoffsetYPix
EoffsetYPix
DoffsetXPix
EoffsetXPix
D24..25 DW ? ; yoffset_ | hit2yfirst
E24..25 DW ? ; yoffset_ | hit2yfirst
DStartkoordinaten des auszugebenden Textes
Estarting coordinates for the text
DSpriteN[] =
ESpriteN[] =
DSpriteN[]
ESpriteN[]
DSpriteN
ESpriteN
DXOR BX,BX ;von Farbe 0 an
EXOR BX,BX ;start with color 0
DMOV CX,100h ;alle 256 Farben
EMOV CX,100h ;all 256 colors
D16
E16
D#6
E#6
D16.
E16.
DTileNr= Nummer der zu plazierenden Kachel
ETileNr= number of the tile to be placed
Dvirtuelle Koordinate, an die die Kachel plaziert werden soll
Evirtual coordinates where the tile shall be placed
DDie Routine ist nur fuer den Hintergrundmodus STATIC sinnvoll
EUsing the routine only makes sense when using background mode STATIC
Dgesetzter Modus STATIC/SCROLLING
Eset mode, STATIC/SCROLLING
Dgewuenschter Hintergrundmodus STATIC oder SCROLLING
Ewanted background mode, STATIC or SCROLLING
D@akt_SpriteX
E@akt_SpriteX
D[@akt_SpriteX+1] = SpriteX
E[@akt_SpriteX+1] = SpriteX
DDI=endx:=sprite[WORD PTR sprite[R]+
EDI=endx:=sprite[WORD PTR sprite[R]+
D(AX=)[yoffset_] = yoffset
E(AX=)[yoffset_] = yoffset
DGNDPAGE, wenn der Hintergrundmodus STATIC benutzt wird), es
EGNDPAGE, if you are using background mode STATIC), however,
Dxt
Ext
DBildausschnitt nicht auf dem Bildschirm
Ewindow is offscreen
D(Dummywert) CX:=breite1+breite2
E(dummy value) CX:=breite1+breite2
D38..39 DB 'K','R' ; Kennung als Sprite
E38..39 DB 'K','R' ; tag used for sprites
Daktuell sichtbare Seite
Eactually visible page
Dskip_zeile
Eskip_zeile
Daktuelle Grafikseite
Eactual graphic page
Dskip_sprite
Eskip_sprite
Daktuelle Farbpalette
Eactual color palette
D²),
E²),
D²+
E²+
D.:
E.:
D[@
E[@
D=[
E=[
D->
E->
Dz
Ez
Dy
Ey
Dx
Ex
Dw
Ew
Dv
Ev
Du
Eu
Dt
Et
Dr
Er
Dq
Eq
Do
Eo
Dn
En
Dm
Em
Dl
El
Dk
Ek
Dj
Ej
Di
Ei
Dh
Eh
Dg
Eg
Df
Ef
De
Ee
Dd
Ed
Dc
Ec
Db
Eb
Da
Ea
DS
ES
DP
EP
D= ((
E= ((
D) )
E) )
D-(
E-(
D] =
E] =
D=[@
E=[@
D!!!
E!!!
D!)
E!)
D)=
E)=
D!:
E!:
D>=
E>=
D<=
E<=
D(=
E(=
D, <=
E, <=
D:= $
E:= $
DZ
EZ
DY
EY
DW
EW
DV
EV
DU
EU
DT
ET
DR
ER
DQ
EQ
DO
EO
DN
EN
DL
EL
DK
EK
DJ
EJ
DI
EI
DH
EH
DG
EG
DF
EF
DE
EE
DD
ED
DC
EC
DB
EB
D9
E9
D8
E8
D7
E7
D6
E6
D5
E5
D4
E4
D3
E3
D2
E2
D1
E1
D0
E0
D"
E"
D!
E!
D.
E.
D,
E,
D
E
D~
E~
D}
E}
D|
E|
D{
E{
D`
E`
D_
E_
D^
E^
D]
E]
D\
E\
D[
E[
D?
E?
D>
E>
D=
E=
D<
E<
D;
E;
D:
E:
D/
E/
D...
E...
D--------------------------------------------------------------------------
E--------------------------------------------------------------------------
D-----------------------------------------------------
E-----------------------------------------------------
D---------------------------------
E---------------------------------
D---
E---
D-
E-
D+
E+
D*
E*
D)
E)
D(
E(
D'
E'
D&
E&
D%
E%
D#
E#
DM
EM
D:=+
E:=+
D) (=
E) (=
D)...
E)...
D= -
E= -
D<>
E<>
DX
EX
D=(
E=(
D, "+
E, "+
D:=(
E:=(
D9.
E9.
D8.
E8.
D7.
E7.
D6.
E6.
D5.
E5.
D4.
E4.
D3.
E3.
D2.
E2.
D1.
E1.
D= ^
E= ^
Ds
Es
D:=-
E:=-
D)*
E)*
D+(
E+(
D:=
E:=
Dp
Ep
D@
E@
DA
EA
D],
E],
D=^
E=^
D[]
E[]
D].
E].
D46..47 DW obere_Begrenzungen
E46..47 DW offset_ptr_to_top_boundary_data
Dwir WriteMode1 verwenden!
Euse write mode 1!
Dtive benoetigt wird und wenn ja, diese in Position bringen!
Ein the right one!
DTilezeile nicht gesondert gezeichnet werden
Eneed to be drawn separately
DDiese Ueberpruefung geschieht punktgenau und ist unabhaengig davon,
EThis check is pixel-precise and doesn't depend on the sprites being
DDie Routine erkennt automatisch, ob es sich bei dem File um ein ein-
EThe routine automatically detects whether the specified file con-
Dmin) und diese Farbe (in p) merken
E(in min) and that color (in p)
Dhier "statisch" aufgenommen!
Ethus, here they were defined "static"
Deigentlichen Spritedaten ignoriert und stattdessen die Hintergrunddaten
Ewill be ignored; instead, the background data underneath the sprite's
Dtine VOR dem Aufruf von ANIMATE auszufuehren, so dass evtl. Aenderungen
Ecall this routine BEFORE calling ANIMATE. That way, evtl. changes to
Dlich ausserhalb des sichtbaren Bereichs), so wird NIL zurueckgegeben!
Eroutine will return NIL!
DDie Linie wird NICHT automatisch in den Hintergrund uebernommen,
EThe line will NOT automatically be taken over into the background
Dmit Farbtabelle umsetzen
Euse color lookup table to transform
Dy in absolute Koordinaten umrechnen
Etransform y into absolue coordinates
Dx in absolute Koordinaten umrechnen
Etransform x into absolute coordinates
Dvirtuelle = absolute Koordinaten
Evirtual = absolute coordinates
Dvirtuelle -> absolute Koordinaten
Evirtual -> absolute coordinates
DTilezaehler in X-Richtung erhoehen
Eincrement tile counter in X-direction
DTileindex bestimmen:
Edetermine tile index:
Drightcut nach AH retten
Esave rightcut to AH
Drichtige Bitplane anwaehlen
Eselect correct bitplane
DTile wurde unten entsprechend geschnitten
Etile has been clipped at its bottom accordingly
DTile wurde rechts und unten entsprechend geschnitten
Etile has been clipped at its right and bottom accordingly
DTile wurde rechts und oben entsprechend geschnitten
Etile has been clipped at its right and top accordingly
DTile wurde rechts entsprechend geschnitten
Etile has been clipped at its right accordingly
DTile wurde links und unten entsprechend geschnitten
Etile has been clipped at its left and bottom accordingly
DTile wurde links und oben entsprechend geschnitten
Etile has been clipped at its left and top accordingly
DTile wurde links entsprechend geschnitten
Etile has been clipped at its left accordingly
DTile muss links, rechts (und unten) ganz auf dem Bildschirm sein
ETile must be onscreen with its left, right (and lower) parts
DDie Bitmap-Grafik in der Datei "name" wurde in die Seite "pa" geladen
EThe bitmap-picture in file "name" has been loaded into page "pa"
Ddieser Wert in Mikrosekunden
Ethat value in microseconds
Dmit %1111 anfangen
Estart with %1111
DMindestzykluszeit (in Mikrosekunden)
Estore min. time for 1 cycle (micro-
Dlinke obere Eck-Tile zeichnen:
Edraw upper left corner-tile:
DHintergrundfarbe holen...
Eget background color...
DHintergrund zeigen!
Epoint to background!
Dmin
Emin
Deine Zeile uebertragen
Emove data of one row
DDieses Fehlerquadrat in BX speichern
EStore that square of error in BX
DDie Grafikseite ist nun fertiggestellt und muss noch angezeigt werden:
EThe graphic page is now ready to be displayed:
DBitplane ins Highbyte bringen
Ebring bitplane to highbyte
DBitplane fuer Lesezugriff nach AX bringen
Ebring bitplane for read access to AX
Dbildschirmstartx retten
Esave ScreenStartX
DBildschirmkoordinaten berechnen
Ecompute screen coordinates
Dlinke obere Ecke des Zieles (in virtuellen Koordinaten)
Eupper left corner of destination (virtual coordinates)
DMindestzeit eines Animationszyklus in Millisekunden
Emin. time for one animation cycle in milliseconds
Deinzutragende Kennung fuer Bilderdateien
Etag for picture file
DDiese Routine verwendet SpriteLADEnummern!
EThis routine uses spriteLOADnumbers!
Dlicutoff_in_Punkten
Elecutoff_in_points
DDifferenz im Rotanteil berechnen
Ecompute difference in red part
DBit 6:=0: keine Doppelwortadressierung von Daten
Ebit 6:=0 -> no double word addressing scheme in
Dgister auswaehlen, den Wert aus dem zugehoerigen
Ethe CRT-controller port, read out the according
DBit 2:=1:kein odd/even-Mechan.
Ebit 2:=1 -> no odd/even-scheme
DBit 3:=0:4 Planes nicht chainen
Ebit 3:=0 -> don't chain planes
DMit BIOS Grafikmodus $13 (=320x200x256) setzen
Euse BIOS to set graphic mode $13 (320x200x256)
D1-PAGE = Grafikseite, auf der gezeichnet werden soll
E1-PAGE = graphic page to be drawn upon
D- viele unterstuetzende Routinen: zeichnen von Linien (mit eingebautem
E- several supporting routines to: draw lines (with built in clipping-
DVerwendete Register: AX und SI
Eused registers: AX and SI
D:= $80
E:= $80
D15, d.h.: weiss
E15, that is: white
Dkleiner Einschub: anhand des Modusbytes des Sprites entscheiden, ob
ENow: look at sprite's mode byte and determine if an other than the
DLB-Startadress-Register
ELB-startaddress-register
Dfuer andere Raender
Efor other edges
Dauch nach [zeilenadr]
Estore it in [zeilenadr], too
DQuellzeiger
Esource pointer
Dnumber
Enumber
Dfuer:
Efor:
D- verschiedene Spritedarstellungsmoeglichkeiten:
E- several sprite display methods available:
Devtl. Verschiebung korrigieren
Eevtl. correct displacement
DoffsetXPix:=leftcut:=StartVirtualX AND $F
EoffsetXPix:=leftcut:=StartVirtualX AND $F
DoffsetYPix:=topcut:=StartVirtualY AND $F
EoffsetYPix:=topcut:=StartVirtualY AND $F
Daktuelle Ausgaberichtung
Eactual output direction
D28..29 DW ? ; | ueberlappy_1
E28..29 DW ? ; | ueberlappy_1
DTRUE/FALSE, falls "GetImage" clippen musste
ETRUE/FALSE, if "GetImage" had to clip image
D(x,0) =
E(x,0) =
Dshort
Eshort
DMOV AX,1017h ;lese Palettenregister
EMOV AX,1017h ;read palette registers
Dfuer jede oben abgeschnittene Zeile 4 Bytes
Eadd 4 bytes to the (offset part of the)
Dausgelesen werden, wenn der Grafikmodus
Eread out directly from the VGA card not
Dausgelesen mithilfe des BIOS-Aufrufs:
Eread out by using the VGA-BIOS-calls:
DPunkt1 rechts des Windows?
Epoint1 right of window?
DPunkt1 oberhalb des Windows?
Epoint1 above window?
DPunkt1 links des Windows?
Epoint1 left of window?
DPunkt unterhalb des Windows?
Epoint below window?
DNun noch die Kacheln links und/oder rechts entlang des Bildschirmrandes:
ENow work on the tiles at the left and/or right edge of the screen:
Dfuer jede Zeile 4 Bytes
E4 bytes for each row
DNummer des aufgetretenen Fehlers
Enumber of the occurred error
Dwuerde codiert werden als:
Ewould be coded as:
Dlicutoff mod 4 gibt an, in welcher Reihenfolge die Punkte aus dem Heap
Elicutoff mod 4 determines the order in which the points must be read
DTP Daten
ETP's data
DTP's Datensegment wiederherstellen
Erestore TP's data segment
DBP = endy, SI=[@max_Breite+1] = max_Breite_in_4er_Gruppen,
EBP = endy, SI=[@max_Breite+1] = max_width_in_groups of 4,
D(Planes abwechselnd von oben nach unten lesen!)
E(read planes top-down, in alternating order!)
DBP retten
Esave BP
DBP nachher wieder poppen!
Epop BP in the end!
DBP direkt verwenden
Euse BP directly
DBP auf die richtige Groesse bringen
Eset BP to proper size
D2.Parameter s2 vom Stack holen
Eget 2nd parameter s2 from stack
D1.Parameter s1 vom Stack holen
Eget 1st parameter s1 from stack
DBP-Register retten
Esave BP-register
DAbweichungsmass steht nun in AX!
Emeasure of difference is kept in AX
DDIV
EDIV
Dstartx
Estartx
D(x1,y1) =
E(x1,y1) =
DAlle Bildschirmteile, die ausserhalb des durch SetBackground-
Eall screen parts, which lie outside the window specified by
Daufgerundet
Erounded up
Dzuerst
Efirst
Daus dem File gelesene Farbpalette, evtl. ergaenzt
Ecolor palette read from the file, evtl. filled up
Dfuer HB/LB auf selber Seite geschieht:
Efor HB/LB takes place while displaying the same page:
Dout: -
Eout: -
Dzufuehren, da die gezeichnete Linie sonst sofort wieder verschwindet)
Ebecause otherwise, the drawn line will vanish at once!)
Dzufuehren, da der gezeichnete Punkt sonst sofort wieder verschwindet)
Ebecause otherwise, the drawn point will vanish at once!)
DNur wenn "was_cut" TRUE ist, sind die Werte der globalen "..._cut"
EOnly if "was_cut" is set to TRUE, the (global) "..._cut" variables
Dnutzt aus, dass AX zufaelligerweise gerade 4 ist
Etake advantage of AX having the value 4!
Dout:
Eout:
DNun werden iterativ die ueberlappenden Zeilen und Spalten exakt geprueft
ENow check the overlapping rows and columns more closely by iteration:
DDummywert
Edummy value
Dwurden auf die Grafikseite 0 eingestellt
Ehave been set to graphic page 0
Dwurde auf STATIC gesetzt
Ehas been set to STATIC
Dwurde auf die Hintergrundseite gesetzt
Ehas been set to the background page
Daus der Tabelle "ShadowTab" ersetzt.
Efrom the table "ShadowTab"
Dnur geladen, nicht gesetzt!
Epalette will only become loaded, not actually set!
DJede dieser Routinen MUSS EXAKT 16 Bytes lang und VOLL RELOKATIBEL
EEvery routine MUST CONSIST OF EXACTLY 16 bytes and BE FULLY RELO-
DMethode, die fuer Sp momentan gesetzt ist: Display_NORMAL,
Eactually set display method for sprite Sp: Display_NORMAL,
D#7
E#7
DKopie von x nach BX
Eplace a copy of x in BX
Dwobei WindowY2=YMAX
Ehere, WindowY2=YMAX
Dwobei WindowX2=XMAX
Ehere, WindowX2=XMAX
Dstarty
Estarty
D(x2,y2) =
E(x2,y2) =
DBloecke
Eblocks
Dalle Spritedaten auf den Heap, und zwar derart, dass die Adresse
Esprite data into the heap, in a way such that the address always
Dglobale Fehlervariable
Eglobal error variable
Delse
Eelse
Dflickerfreie Animation durch page-flipping, Auswertung von Retrace-
Eflickerfree animation by using page-flipping, watching retrace
Dfuer blau
Efor blue
Dsicher ist sicher!
Ejust to be sure!
Dhier:
Ehere:
Dright_cut,top_cut,bottom_cut = dto., fuer andere Raender
Eright_cut,top_cut,bottom_cut = dto., for the other boundaries
D6..7 DW Plane_3_Daten
E6..7 DW offset_ptr_to_plane3_data
DDI = starty, BX = SpriteY, DX=[@akt_SpriteX+1] = SpriteX,
EDI = starty, BX = SpriteY, DX=[@akt_SpriteX+1] = SpriteX,
D- Sprites koennen pixelweise als durchsichtig gegenueber dem Hintergrund
E- sprites can be declared to be transparent with regard to the background
DES:BX = (Zeiger auf Zieladresses) zu bringen sind;
EES:BX = (pointer to destination address)
DBytes_je_Plane3_Zeile
Ebytes_per_plane3_row
DBytes_je_Plane2_Zeile
Ebytes_per_plane2_row
DBytes_je_Plane1_Zeile
Ebytes_per_plane1_row
DBytes_je_Plane0_Zeile
Ebytes_per_plane0_row
DCycleTime
ECycleTime
D16 Punkte = 4 Bytes
E16 pixels = 4 bytes
Dmitgetauscht werden muss!
Eto accomplish that!
Deigentlich: (x MOD XTiles)
Eto be exact: (x MOD XTiles)
Deinen Spritezyklus
Ethey make up a sprite cycle
DDisplay_FAST, Display_SHADOW bzw. Display_UNKNOWN, wenn das
EDisplay_FAST, Display_SHADOW or Display_UNKNOWN, if the
DDie Bitmaske fuer den richtigen Schreibe-Planezugriff wurde bereits
EThe proper bitmask for selecting the correct write plane has al-
Dtiles
Etiles
Dlinke obere Ecke des zu sichernden Bildausschnittes
Eupper left corner of the area which shall be stored
Dsignalen und Verwendung eines speziellen VGA-256-Farbengrafikmodus
Esignals and usage of a special 256 color mode of the VGA
DNextSprite[SpriteN[?]]
ENextSprite[SpriteN[?]]
Dmax_Breite_in_4er_
Emax_width_in_groups_of_4
DCL
ECL
DBL
EBL
DAL
EAL
DPAGESIZE
EPAGESIZE
DPAGE
EPAGE
DBACKGROUNDMODE
EBACKGROUNDMODE
DBACKGNDPAGE
EBACKGNDPAGE
DFALSE
EFALSE
Dx:=((x AND $FFF0)-BackX1) DIV 16 (nicht SHR 4)!
Ex:=((x AND $FFF0)-BackX1) DIV 16 (not: SHR 4)!
DAND
EAND
DDS = ^Spritedaten, ES = ^Grafikseite
EDS = ^sprite data, ES = ^graphic page
D(Segment-)Zieladresse ist aktive Grafikseite
E(segment part of) dest. address is active page
DES:=Segment_Adr[1-PAGE], denn 1-PAGE=sichtbare Seite
EES:=Segment_Adr[1-PAGE], because 1-PAGE=visible page
DES:DX:=y2un[Spalte]
EES:DX:=y2un[column]
DES:DX:=x2re[Zeile]
EES:DX:=x2re[row]
DES:DX:=x2li[Zeile]
EES:DX:=x2li[row]
DDS:CX:=y1un[Spalte]
EDS:CX:=y1un[column]
DDS:CX:=x1re[Zeile]
EDS:CX:=x1re[row]
DDS:AX:=x1li[Zeile]
EDS:AX:=x1li[row]
DIF PAGE=0 THEN PAGE:=1 ELSE (PAGE=1) PAGE:=0
EIF PAGE=0 THEN PAGE:=1 ELSE (PAGE=1) PAGE:=0
DPlane1
EPlane1
Dwird von TP wiederhergestellt
Ewill be restored by TP automatically
Drigh_cut
Eright_cut
Ddirekt
Edirectly
DTile muss ganz auf dem Bildschirm sein, es findet
Etile must be completely onscreen, there will be
DHier gilt: die beiden Punkte wurden auf den sichtbaren Bereich zurecht-
Eprecondition here: both points have been clipped to the visible window;
Deiner Weitersetzung um 4 Bildpunkte entspricht
Ecorresponds to an ajustment of 4 points
Ddie letzte Hex-Ziffer $0 ist!
Elast hex-digit is $0!
DBitplane 3 zu Bitplane 0 muss dabei die Start-
Efrom bitplane 3 to bitplane 0, then the start-
Dbis rechte obere Ecke erreicht
Euntil upper right corner has been reached
Dgilt wg. TimeFlag:=$80 die Zeitbedingung noch nicht!
Efor the very first animation cycle, yet!
Dfindet jedoch keine Ueberpruefung statt!
Ethe routine doesn't check that!
Dwird beim Verlassen der Prozedur gebraucht!
Ewill be needed when leaving the procedure!
DDie Grafik der Hintergrundseite wurde in der Datei "name" abgelegt
EThe picture of the background page has been stored as file "name"
DDie Grafik auf Seite "pa" wurde in der Datei "name" als Bitmap abgelegt
EThe picture at page "pa" has been stored (as bitmap) to file "name"
DTile wurde auf aktueller Seite PAGEADR gezeichnet
Etile has been drawn on actual page PAGEADR
DTile wurde auf aktueller Seite PAGEADR bei (0,0) gezeichnet
Etile has been drawn at (0,0) on the actual page PAGEADR
DDie Grafikseite BACKGNDPAGE wurde mit der Farbe "Color" gefuellt
EThe graphic page BACKGNDPAGE has been filled with color "Color"
Ddirekt zu @LineReady verzweigt!
E@LineReady, instead!
Drightcut
Erightcut
DDie Routinen koennen sicher sein, dass CX<>0 ist
EThe routines can rely upon CX being <>0
Dhit2yfirst
Ehit2yfirst
Dhit2xfirst
Ehit2xfirst
Dhit1yfirst
Ehit1yfirst
Dhit1xfirst
Ehit1xfirst
Dwird ueber Stack adressiert!
Ewill be addressed via SS!
Dbisher gefundenes minimales Fehlerquadrat
Emin. square of error (up to now)
DDiff ≈±2^6 -> Quadrat ≈±2^12 -> 3*Quadrat<MaxInt
EDiff ≈±2^6 -> square ≈±2^12 -> 3*square<MaxInt
DBP:=16+3-rightcut, denn die Zahl der Bytes je Zeile fuer
EBP:=16+3-rightcut, because the number of bytes per row
DBP:=16+3-leftcut, denn die Zahl der Bytes je Zeile fuer
EBP:=16+3-leftcut, because the number of bytes per row
D(virtuelle) Startkoordinaten des auszugebenden Textes
E(virtual) starting coordinates for the text to be written
Dbringen, AUF KEINEN FALL AUFRUFEN!!!
EDO NOT TRY TO CALL THIS "PROCEDURE"!!!
Daktuelle Grafikseite(nadresse),auf der gezeichnet werden soll
Eactual graphicpage(address) on which to draw upon
Daktuelle X-Koord. auch weitersetzen: x:=x+16
Eincrement actual X-coordinate, too: x:=x+16
Dalle Spalten durch?
Eall columns done?
Dalle Zeilen durch?
Eall rows done?
Dalle Bytes durch?
Eall bytes done?
D(Farbe 0 ignorieren, da "durchsichtig")
E (ignore color 0 as "transparent")
Dalso kein Overflow moeglich
Eso no overflow is possible
DPlane i berechnet sich zu (16+3-i-rightcut) SHR 2
Eof plane i is computed by (16+3-i-rightcut) SHR 2
DPlane i berechnet sich zu (16+3-i-leftcut) SHR 2
Eof plane i is computed by (16+3-i-leftcut) SHR 2
DPlane2
EPlane2
D=yt*XTiles+(xt-1)
E=yt*XTiles+(xt-1)
DBytes_zu_moven fuer i=1
Ebytes_to_move for i=1
Dum wieviel Punkte der Ausschnitt links ausserhalb des Bild-
Ehow many pixels at the left edge of the image lie outside
Dtionszyklus (dann aber permanent) (Deshalb ist es sinnvoll, diese Rou-
Eplace (but then, it remains permanent) (For that reason, you should
DSCROLLADR wurde auf die scrollbare Hintergrundseite gesetzt
ESCROLLADR has been set to the scrollable background page
Dja
Eyes
Dpa
Epa
DSpriteX
ESpriteX
Dalso number+i
Eis, number+i
DPlane3
EPlane3
D SpriteN[s1],SpriteX[s1],SpriteY[s1] = Spritedaten von Sprite s1
ESpriteN[s1],SpriteX[s1],SprizeY[s1] = sprite data of sprite s1
DES:BX=Zeiger auf TimeFlag, Bit 7=0/1
EES:BX=pointer to TimeFlag, bit 7=0/1
Dim CRT-Controller das underline-location-Re-
Eaddress the underline-location-register at
DBP=16+3-leftcut
EBP=16+3-leftcut
DBP=16+3-rightcut
EBP=16+3-rightcut
D; jetzt fuer temporaere Variablen reservierter
E; now follows the scratch area reserved for temporary
Dof ASM
Eof ASM
D48..49 DW untere_Begrenzungen
E48..49 DW offset_ptr_to_bottom_boundary_data
DOktanden berechnen
Ecompute octant
D#8
E#8
Daktuelle Textausgabefarben
Eactual text color
Daktuelle Schreibplane waehlen
Echoose plane to write at
Daktuelle Schreibplane merken
Esave actual write plane
Daktuelle Leseplane waehlen
Echoose plane from which to read
Daktuelle Leseplane 0 waehlen
Echoose plane 0 for reading
DSpriteX[],SpriteY[] =
ESpriteX[],SpriteY[] =
DSpriteY
ESpriteY
D- Spritebewegung pixelweise (und nicht nur byteweise) moeglich
E- sprite movement in any pixel-increments you want
DDS:SI = (Zeiger auf Quelladresse) nach...
EDS:SI = (pointer to source address) to...
DPlane4
EPlane4
D+(licutoff_in_Punkten+i) DIV 4
E+(lecutoff_in_points+i) DIV 4
D+(licutoff_in_Punkten+1) DIV 4
E+(lecutoff_in_points+1) DIV 4
D SpriteN[s2],SpriteX[s2],SpriteY[s2] = Spritedaten von Sprite s2
ESpriteN[s2],SpriteX[s2],SpriteY[s2] = sprite data of sprite s2
D[@Starty_2+1] = starty*2
E[@Starty_2+1] = starty*2
DSTATIC/SCROLLING fuer festen/scrollbaren Hintergrund
ESTATIC/SCROLLING for solid/scrollable background
DDieser Modus ist verschieden vom Modus $13 der VGA!!!
EThis mode is different from mode $13 of the VGA-BIOS!!!
Dalle Sprites, zerlegt diese in Tiles und legt sie in der 4.Grafik-
Esprites, splits them into tiles and stores them into the 4th graphic
D012A: STOSW
E012A: STOSW
DFuellfarbe fuer die Hintergrundseite BACKGNDPAGE
Ecolor for filling the background page BACKGNDPAGE
DMOD
EMOD
Dhier: BP=max(x1last,x2last) (=maxx)
Ehere: BP=max(x1last,x2last) (=maxx)
Dhier: SI=min(x1,x2) (=minx)
Ehere: SI=min(x1,x2) (=minx)
Dminx
Eminx
Dbildschirmstartx
EScreenStartX
D[@max_Breite+1] =
E[@max_Breite+1] =
D[@max_Breite+1]
E[@max_Breite+1]
Drand
Erand
DVar., die durch "GetImage" gesetzt werden und
Evariables set by "GetImage"; if "was_cut" has
DFarben gewuenscht sind!
Edarker colors only!
Dfalls Ausschnitt ueber rechten Bildschirmrand
Eif image would spread over the right screen
DDatei existiert nicht oder nicht unter diesem Pfad
EFile doesn't exist or at least not with that path
D(Deshalb ist es sinnvoll, diese Routine NACH Aufruf von ANIMATE aus-
E(For that reason, you should call this routine AFTER calling ANIMATE
DAlgorithmus der dafuer benutzt werden soll
Ealgorithm which shall be used
Dalter Grafikmodus, auf den zurueckgeschaltet werden soll
Eold graphic mode you want to be switched back at
D013B: IN AL,DX
E013B: IN AL,DX
D013A: INC DX
E013A: INC DX
D0118: INC DX
E0118: INC DX
Dhier: AX=max(y1last,y2last) (=maxy)
Ehere: AX=max(y1last,y2last) (=maxy)
Dminy
Eminy
Dnaechste
Enext
Dnaechste Zeile
Enext row
Dnach letzter Grafikzeile
Eto last graphic row
D(z.B.: Pixel (1,5,9,...),(2,6,10,...),(3,7,11,...)
E(e.g.: pixels (1,5,9,...),(2,6,10,...),(3,7,11,...)
DBackgroundmode
EBackgroundmode
Dnaechstes Byte
Ework on next byte
Dhalb des Bildes (also zurueckgegebener Zeiger=NIL), dann liefert die
E_completely_ offscreen (this means: returned ptr=NIL), then the
DDa als Hintergrundseite BACKGNDADR verwendet wird, ist die
EBecause BACKGNDADR is used as background page, calling
DPage-Wert *2 (da Worteintraege!)
Epage value *2 (word-sized entries!)
Dnaechste Zeile (-> Word-Werte!)
Enext row (-> word-sized values!)
Dnaechste Schreibplane:
Enext write plane:
Dnaechste Leseplane:
Enext read plane:
Dmax_Breite
Emax_Breite
Dname
Ename
DDass BP "3 zu gross ist" stoert nicht, da dieser Code nur ausge-
EBP being "3 units to big" doesn't matter, because this code will
Dnaechste Farbe
Enext color
DZahl der bisher eingelesenen Paletteneintraege
Enumber of palette entries read in til now
Dund
Eand
DAnimate loescht den Inhalt der alten Grafik (mithilfe der Hintergrund-
EAnimate erases the old contents of the page (using the background page
Dansonsten: Treffer in X-Ri., jetzt noch Y-Ri. pruefen (analog zu oben) und
Eotherwise: collision in X-direction, now check Y-dir. also (as above) and
DInaktive Sprites (SpriteN[s?]=0) koennen nicht miteinander kollid.
Einactive sprites (SpriteN[s?]=0) cannot collide
Dkleine Pseudoprozedur, um die Umsetztabelle fuer die Bitmaske auch im
ESmall pseudo-procedure to store lookup table for the bitmasks into
Dplayenable-Signal und schaltet dann auf die so fertiggestellte Seite um
Eenable signal and switches the display to that now completed page
Dnur noetig fuer Compilerschalter G+!
Eonly necessary for compiler switch G+!
Dhier: SI (DI) = Zeiger auf 1. (2.) Sprite in ?WRTD[..] ,
Ehere: SI (DI) = pointer to 1. (2.) sprite in ?YWRTD[..],
DAnzahl Kreise
Enumber of circles
DAnzahl Bildschirmpunkte
Enumber of screen pixels
DAnzahl Aufrufe der Verzoegerungsschleife
Enumber of executions of the delay loop
Dung zurueckgeben, da nur dunklere
Edifference, as we are looking for
Dund (0,4,8,...); letztere Bitplane wird um 1 Byte
Eand (0,4,8,...); the last bitplane needs a cor-
Din der Farbe COLOR gezeichnet; die Routine fuehrt dabei selber die
Eusing the color COLOR; the routine will take care of transforming
DAnzahl zu sichernde Bytes je Zeile
Enumber of bytes to store for each row
Duntere
Elower
Ddabei ist WindowX1 = 0
Ehere, WindowX1 = 0
Dkarte von: Kai Rohrbacher, 1988-1991, Turbo-Pascal 6.0
Ecard by: Kai Rohrbacher, 1988-1991, Turbo-Pascal 6.0
Dnoch genug Platz da?
Eenough space left?
D8..9 DW Breite (in 4er-Gruppen)
E8..9 DW width (in groups of 4) (in German: "Breite")
Dstartx:=sprite[WORD PTR sprite[L]+
Estartx:=sprite[WORD PTR sprite[L]+
Dalten Schirminhalt nach links schieben:
Escroll old screen contents to the left:
Dalten Schirminhalt nach rechts schieben:
Escroll old screen contents to the right:
Dalle noch relevanten Register retten
Esave all registers needed later
Dalten Inhalt nach oben rollen:
Escroll old contents upwards:
Dalle 4 Planes gleichzeitig ansprechen
Eaccess all 4 planes at once
Dals Zielindex verwendet werden kann
Eused for accessing the target address
Dals Schreibplane anwaehlen
Euse it as write plane
Dals neue SpriteN[?] uebernehmen
Euse it as new SpriteN[?] value
DPlane auswaehlen
Echoose plane
DPlane anwaehlen
Eselect plane
DFlag zuruecksetzen
Ereset Flag
Dalten Lese-/Schreibmodus setzen
Erestore old read-/write mode
Dalten Lese-/Schreibmodus merken
Esave old read-/write mode
Dals Ergebnis 1 = TRUE zurueckgeben
Ereturn 1 = TRUE as result
Dals Ergebnis 0 = FALSE zurueckgeben
Ereturn 0 = FALSE as result
Dalle 4 Planes gleichzeitig beschreiben
Ewrite to all 4 planes simultaneously
Dalle 4 Planes gleichzeitig bearbeiten
Ework on all 4 planes simultaneously
Dalle 256 Default-Farben durchsehen
Ewalk through all 256 default colors
Dalten Inhalt von BP wiederherstellen
Erestore old contents of BP register
Dplanes) auf 0 setzen
Ebitplanes) to 0
DAlles ging gut: Palette zurueckgeben
Eeverything went alright: return palette
D0129: REPNZ
E0129: REPNZ
Dum 1 erhoehen MOD 4
Eincrement by 1 MOD 4
DSinnvoll ist eigentlich nur pa=BACKGNDPAGE
Emost often, you will use pa=BACKGNDPAGE
Dbis zum naechsten Animationszyklus (= Aufruf von ANIMATE)
Eonly until the next animation cycle (=till calling ANIMATE)
DEin Sprite kann nicht mit sich selbst kollidieren (s1=s2 -> FALSE)
EA sprite can't collide with itself, (thus: s1=s2 -> FALSE)
DDa als Hintergrundseite BACKGNDADR verwendet wird, ist die Verwendung
EBecause BACKGNDPAGE is used as background page, calling this
DFarbe 0 ist auch fuer Schatten durchsichtig
Ecolor 0 is transparent for shadows, too
DBH=0 -> BX=Zeichenseite
EBH=0 -> BX=drawing page
DBH=0 -> BX = Grafikseite
EBH=0 -> BX = graphic page
DAnzahl der aus dem File gelesenen Tiles (0 = Fehler trat auf)
Enumber of the tiles read in from the file (0 = error occured)
DAnzahl der aus dem File gelesenen Sprites (0 = Fehler trat auf)
Enumber of the sprites read in from the file (0 = error occured)
DBackX1
EBackX1
DBackY1
EBackY1
Dja, neue Koordinaten berechnen: y1:=y1+(y2-y1)/(x2-x1)*(WindowX1-X1)
Eyes, compute new coordinates: y1:=y1+(y2-y1)/(x2-x1)*(WindowX1-X1)
Dja, berechne x1:=x1+(x2-x1)/(y2-y1)*(WindowY1-y1), y1:=WindowY1
Eyes, compute x1:=x1+(x2-x1)/(y2-y1)*(WindowY1-y1), y1:=WindowY1
Din: (x,0) =
Ein: (x,0) =
Dof FOR
Eof FOR
Daktuelle Zeichenfarbe sei Weiss
Eset actual drawing color to white
DExistiert das Sprite noch nicht oder ist der Modus nicht er-
EIf the sprite doesn't exist yet (or the mode isn't allowed),
D199
E199
D#9
E#9
DDS:SI = Zeiger auf Daten, ES:DI = Zieladresse dafuer auf dem Schirm,
EDS:SI = pointer to data, ES:DI = dest. address on screen for them
D- maximale Spritegroesse 64k
E- maximal size of each sprite = 64k
DDX
EDX
DBX
EBX
DCX
ECX
DAX
EAX
Dnach
Eto
Danderenfalls keine Zeitueberwachung!
Eotherwise: no timing mechanism!
Dja, berechne: y1:=y1+(y2-y1)/(x2-x1)*(WindowX2-X1), x1:=WindowX2
Eyes, compute y1:=y1+(y2-y1)/(x2-x1)*(WindowX2-X1), x1:=WindowX2
Dja, berechne x1:=x1+(x2-x1)/(y2-y1)*(WindowY2-y1), y1:=WindowY2
Eyes, compute x1:=x1+(x2-x1)/(y2-y1)*(WindowY2-y1), y1:=WindowY2
Din: (x1,y1) =
Ein: (x1,y1) =
DAnzahl der zu vergleichenden Zeilen -1
Enumber of rows -1 to compare
DAnzahl der zu vergleichenden Spalten -1
Enumber of columns -1 to compare
Dabsolute Koord.
Eabsolute coord.
Dabgeschnitten sind:
Enot at the sides!):
D18..19 DW ? ; licutoff_ | hit1xfirst
E18..19 DW ? ; licutoff_ | hit1xfirst
D4*8000h physikalische Woerter (wg. den 4 Bit-
Ewords = 4*8000h physical words (because of 4
DCRT-Controller
ECRT-Controller
Dsprite[WORD PTR (licutoff_...)]
Esprite[WORD PTR (licutoff_...)]
Dsprite[WORD PTR licutoff_...]
Esprite[WORD PTR licutoff_...]
D"Succ", um BackTile[0] freizuhalten
E"succ", to hold free BackTile[0]
DDS wiederherstellen
Erestore DS
DcenterX
EcenterX
DdeltaX
EdeltaX
Dfalls Abweichung kleiner als bisheri-
Eif difference is less than the present
DDas ist zugleich die (Offset-)Quelladresse in Page 3
EThat's also the offset part of the source ad. in page3
Doberste Tilezeile:
Etop most tile row:
Dobere
Eupper
Dobere linke Bildschirmecke
Eupper left image corner
DModus 0 betrachtet die Farbe 0 als durchsichtig fuer den Hintergrund
Emode 0 considers color 0 being transparent for background data
Dmod
Emod
DCRTAddress
ECRTAddress
D- Routine zur exakten Feststellung der Kollision zweier Sprites
E- pixel precise hit-detection routine for sprite collisions built in
D(=x2last)
E(=x2last)
DcenterY
EcenterY
DdeltaY
EdeltaY
Danzuzeigende Bildschirmseite (0..3)
Egraphic page to be shown (0..3)
Dvon vorletzter Grafikzeile
Efrom last but one graphic row
DModus 2 ist fuer "Schatten" und aehnliches gedacht: hierbei werden die
Emode 2 is thought for "shadows" and the like: the sprite's data itself
Dmode
Emode
DHoehe
Eheight
Dab jetzt: BX=0 !
Efrom now on: BX=0!
Dmomentan aktuelle Palette
Eactually set palette
DModus 3 ist ebenfalls fuer "Schatten" gedacht: hierbei werden alle Sprite-
EModus3 is thought for "shadows", too: in this mode, all sprite
DTRUE/FALSE fuer "Sprites kollidieren"/"Sprites kollidieren nicht"
ETRUE/FALSE for "sprites collide"/"sprites do not collide"
DTRUE/FALSE, wenn die Maschine (mindestens) ein AT ist
ETRUE/FALSE, if the machine is (at least) an AT
DClipping-Algorithmus), Punkten und Grafik-Text (dto.), automatische Ver-
Ealgorithm), points and graphic-text (incl. clipping), automatic heap
DPlane0 = x,x,x,x,r,r
Eplane0 = x,x,x,x,r,r
DUmrechnung der angeg. Koordinaten in absolute Bildschirmkoordinaten
Ethe coordinates to absolute screen coordinates and evtl. necessary
Dimmer auf eine Segmentgrenze fällt. Diese Anfangsadressen werden
Elies on a segment (=paragraph) boundary. These starting addresses
Dum 1 Adresse weitersetzen!
Eneeds mending: increment address by 1!
Dim Map-Mask Register alle 4 Ebenen selektieren
Euse MapMask register to select all 4 planes
Dim MapMask Register alle 4 Ebenen selektieren
Euse MapMask register to select all 4 planes
Dim Bildschirmspeicher durchfuehren
Evideo ram
Dim Sequenzer das Speichermodusregister auswaehlen
Eselect memory-mode-register at sequencer port
Dimmer auf eine Segmentgrenze faellt. Diese Anfangsadressen werden
Elies on a segment (=paragraph) boundary. These starting addresses
DFarbe (0..255)
Ecolor (0..255)
Dnormal : durchsichtig fuer Farbe 0
Enormal : transparent for color 0
Dwobei WindowY1=0
Ehere, WindowY1=0
DoldMode = alter Grafikmodus
EoldMode = old graphicmode
Dmationszyklus (dann allerdings permanent)! (Deshalb ist es sinnvoll,
Eplace (but then, it stays permanent)! (For that reason, you normally
DDa eine Kachel 16x16 Punkte gross ist, muessen die Sprites ein Viel-
EBecause a tile consists of 16x16 points, the sprites must be a mul-
DTabelle der Grafikzeilen-Startadressen (Offset-Anteil)
Etable with graphic rows starting addresses (offset part)
Dja, Flag fuer "Punkt unterhalb des Fensters" bel.
Eyes, don't change flag for "point is below window"
Dja, Flag fuer "Punkt oberhalb des Fensters" bel.
Eyes, don't change flag for "point is above window"
DYaktuell
EYactual
Dpal
Epal
DRand: y:=((y AND $FFF0)-BackY1) DIV 16
Etop boundary: y:=((y AND $FFF0)-BackY1) DIV 16
DAH:=leftcut mod 4
EAH:=leftcut mod 4
DKompensation in Diagonalrichtung
Ecompensation in diagonal direction
DKoordinaten zulaessig
Ecoordinates admissible
Dabzuspeichernde Seite (0..2)
Epage to store (0..2)
Dabzuspeichernde Seite (=2)
Epage to be saved (=2)
Dnoch ein einzelnes Byte uebrig?
Edoes a single byte remain?
Ddoch, fertig!
Ebut yes, nothing to do!
Dhoehe1+hoehe2-(maxy-miny+1)-1
Ehoehe1+hoehe2-(maxy-miny+1)-1
Dhoehe1
Ehoehe1
DCode1
ECode1
DPAGEADR
EPAGEADR
DBACKGNDADR
EBACKGNDADR
Dals Defaulttile fuer den scrollbaren Hintergrund wurde #0 gesetzt
Etile #0 has been set as default tile for scrollable background
DIF offscreenFlag OR (xt<0) OR (xt>=XTiles)
EIF offscreenFlag OR (xt<0) OR (xt>=XTiles)
DIF offscreenFlag OR (xt-1<0) OR (xt-1>=XTiles)
EIF offscreenFlag OR (xt-1<0) OR (xt-1>=XTiles)
D4 Fuellbytes; schneller als 4 NOPs
E4 filling bytes; faster than 4 NOPs
D- Sprites koennen ihre Farbe in Abhaengigkeit ihres momentanen Hinter-
E- sprites can change their color depending on the underlying background
DES:DI=Zeiger auf Grafikadresse von Punkt1, DX=Zugriffsmaske dafuer
EES:DI=pointer to graphic address of point1, DX=access mask for it
DES:DI = Zeiger auf den besorgten Speicher
EES:DI = pointer to the acquired memory
DDS:SI = Zeiger auf erstes zu speicherndes Byte; ES:DI = Zieladr. dafuer
EDS:SI = pointer to first byte to store; ES:DI = its target address
DDS:SI := ES:DI (Quellzeiger:=Zielzeiger)
EDS:SI := ES:DI (source ptr:=dest. ptr)
DSinnvolle Werte fuer "pa" sind nur 0 und 1 (und evtl. BACK-
ESensible values for "pa" are either 0 or 1 (and evtl. BACK-
Dungefaehre Zeit (in Millisekunden), in der das geschehen soll
Etime (in millisceconds) for this action (approx.)
DAnzahl Pixel
Enumber of pixels
DDI:=y1
EDI:=y1
DCode2
ECode2
Dhoehe2
Ehoehe2
D100h-DL = gefundene optimale Farbe
E100h-DL = optimal color found
DREP MOVSB
EREP MOVSB
D- Verwaltung von bis zu 32767 verschiedenen Sprites (Voreinstellung: 1000)
E- up to 32767 different sprites (default: 1000)
DSchaltet der Benutzer (durch Angabe von milliseconds=0) die
EIf you don't use the timing mechanism (by supplying a value
Dschirm ragte)
Eof the screen)
DAchtung! Da PAGEADR immer die nichtsichtbare Grafikseite
EAttention! As PAGEADR always specifies the NOT visible gra-
Dy1un+y1 (=a)
Ey1un+y1 (=a)
Dx1re[Zeile]+x1 (=a)
Ex1re[row]+x1 (=a)
D=yt*XTiles+xt
E=yt*XTiles+xt
D+yoffset
E+yoffset
DDisplay_NORMAL
EDisplay_NORMAL
Dnach rechts scrollen
Escroll to the right
Dnach links scrollen
Escroll to the left
Dnach unten scrollen
Escroll downwards
Dnach oben scrollen
Escroll upwards
Dja, nichts zu tun
Eyes, ignore it
DDaten auf einen Satz uebertragen
Emove data as one block at once
Dnachfolgende NOP's ueberspringen
Ejump over following NOP's
Dragen wuerde: rechten cutoff bestimmen
Eboundary: compute right cutoff
Dnaechste Bitplane anwaehlen; bei einem wrap von
Eselect next bitplane; if wrap-around occurs
Dlativ codiert) zu falscher Adresse verzweigen!
ERELATIVE - and thus, jump to ever-neverland!
Ddazu Startadresse des Feldes addieren
Eadd start address of array to that
Dfaches von 16 Punkten in x- und y-Richtung sein
Etiple of 16 points in each direction (x _and_ y)
Ddass sie im Ring aufeinander zeigen, d.h.: sie bilden
Eset such that they build a "ring", that is: together
DDa als Hintergrundseite BACKGNDADR verwendet wird, ist die Verwen-
EBecause BACKGNDADR is used as background page, calling this rou-
Dmales Verhalten von TurboPascal's OutText-Routinen!)
Edon't change (=normal behaviour of TP's OutText-procs)
D------- ab hier: Sprites auf aktuelle Grafikseite bringen
E------- starting here: put sprites on actual graphic page
DPage-Wert in BX merken!
Esave page value to BX!
Dnaechste Plane anwaehlen
Eselect next plane
Dmax. Anzahl an Hintergrund-Kacheln
Emax. number of background tiles
DMaske wieder nach DX retten
Esave mask to DX again
DMaske fuer VRAM-Zugriff holen
Eget mask for VRAM-access
DMaske fuer Portzugriff laden
Eload mask for port-access
DMaske fuer naechsten Punkt berechnen
Ecompute mask for next point
DMaske auf 1 zuruecksetzen
Erestore mask to 1
Dja: Treffer in X-Richtung gefunden!
Eyes: collision in X-direction found!
Dja: Treffer gefunden!
Eyes: collision detected!
Dja, Zeitueberwachung soll benutzt werden
Eyes, time control mechanism shall be used
Dja, Punkte vertauschen
Eyes, swap points
Dja, nix zu tun
Eyes, nothing to do
Dja, Flag fuer "Punkt rechts vom Fenster" belassen
Eyes, don't change flag for "point is right of window"
Dja, Flag fuer "Punkt links vom Fenster" belassen
Eyes, don't change flag for "point is left of window"
Dja, Erhoehung von DI rueckgängig machen
Eyes, make incrementing DI undone
Dja, Ecke muss noch gezeichnet werden
Eyes, corner remains to be drawn
Dja, deltaY und Zeileninkrement negieren
Eyes, negate deltaY and row-increment
Dja, deltas vertauschen und Flag setzen
Eyes, swap deltas and set flag
Dja, Anzahl Tiles in diesem Spritefile ermitteln
Eyes, get number of tiles in that sprite file
DFarbtabelle uebernehmen
Eactivate new color table
DFarbe fuer Punkt holen
Eget color of point
DFarbdifferenz im Rotanteil berechnen:
Ecompute color difference for red color part:
DDazu kommen die oben abgeschnittenen Zeilen:
Eadditionaly: the rows cut off at the upper edge:
DDaten einer Zeile abspeichern
Estore data of one row
DDateilaenge ermitteln
Edetermine file length
DDarf keinenfalls unterbrochen werden!
EMay not be interrupted!
DRanddaten
Eboundary data
Dmax. Breite in 4er-Gruppen
Emax. width in groups of 4
Dmax_Breite_in_Punkten
Emax_width_in_points
Dmax_Breite_in_4er_Gruppen
Emax_width_in_groups_of_4
Dwaltungs des Heaps zum Speichern/Laden von Sprites, Hintergrundbildern,
Emanagement for storing/loading sprites, handling background images,
Dja, Fehlerquadrat und Farbe merken
Eyes, store square of error and color
Dja, bessere Naeherung koennen wir nicht mehr finden!
Eyes, we can't find any better solution than that!
DFarbpalette in ActualColors uebernehmen
Ecopy palette into ActualColors
DDatenregister auslesen:
Edata register:
DDaten ueber das zugehoerige Datenregister lesen
Eread in data via the according data register
Dja, Erhoehung von DI rueckgaengig machen
Eyes, make increase of DI undone
DSI auch
ESI, too
DSI = ((licutoff_in_Punkten+1) AND 3)*2
ESI = ((lecutoff_in_points+1) AND 3)*2
DSI = ((licutoff_in_Punkten+0) AND 3)*2
ESI = ((lecutoff_in_points+0) AND 3)*2
DSI = startx, DI = (Yaktuell+starty)*2
ESI = startx, DI = (Yaktuell+starty)*2
DDI=[@Starty_2+1] = starty*2
EDI=[@Starty_2+1] = starty*2
D(x,y) =
E(x,y) =
D40
E40
D80
E80
D#0
E#0
D10.
E10.
D100
E100
DSpalte
Ecolumn
D(physikalischen) Sprites gebildet werden, so muessen die
Ewhose load numbers aren't consecutive, then you
DSprite noch nicht geladen wurde!
Esprite has not been loaded yet!
DSpritedaten von Sprite
Esprite data of sprite
DSchreibmodus 0 (oder direkt:=$40)
Ewrite mode 0 (or directly :=$40)
Dupdate
Eupdate
DDS = normales Datensegment, ES = Grafikseitensegment,
EDS = normal data segment, ES = graphic page segment,
D- Scrollbares Hintergrundbild ebenfalls unterstuetzt
E- scrolling background image, too
D- Sprites werden beim Verschwinden an einer der Bildschirmgrenzen korrekt
E- correct clipping of sprites at the screen boundaries when moving on- or
Din
Ein
Dentsprechenden Stellen
Ewhere it will be needed
DAnzahl Bytes, die von...
Enumber of bytes, which have to be copied from...
Din der Datei so werden sie mit fortlaufender Nummer eingetragen,
Ehas been loaded, they will be stored with consecutive numbers, that
DEnthaelt die Datei mehrere Tiles, so werden sie zeilenweise geladen,
EIf the file contains more than one tile, they will be loaded by row,
Din Prozent zu der Helligkeit ihrer Originalfarben
Ein percentage of the brightness of the original colors
Dund auf aktueller Seite darstellen
Eand display on actual graphic page
Dund Wert holen
Eand fetch value
Dund fuer spaeter merken
Eand preserve it for later
DAnzahl zu zeichnende Zeilen
Enumber of rows to draw
Din: -
Ein: -
Din:
Ein:
DAnzahl abzuschneidende Zeilen
Enumber of lines to be cut off
DAnzahl der rechts abzuschneidenden Tile-Spalten
Enumber of right tile-columns to be cut off
DAnzahl der links abzuschneidenden Tile-Spalten
Enumber of left tile-columns to be cut off
DAnzahl der unten abzuschneidenden Tile-Zeilen
Enumber of bottom tile-rows to be cut off
Din neue_Tabelle[i] eintragen
Estore into neue_Tabelle[i]
DYMAX
EYMAX
DXMAX
EXMAX
D%0111
E%0111
Dschnell : keine Hintergrundberuecksichtigung
Efast : don't take background into account
D30..31 DW ? ; | x1
E30..31 DW ? ; | x1
DVGAMono oder VGAColor - Adapter
Emonochrome or color VGA - adapter
Dabzuarbeitende Zeilenanzahl
Enumber of rows to process
DDI:=0*LINESIZE +(x div 4)=x div 4
EDI:=0*LINESIZE +(x div 4)=x div 4
DSI um cutoff in Bytes weitersetzen=leftcut div 4
Eincrement SI by cutoff (=leftcut div 4) bytes
DSchirm zu bringen; die Schnittstelle ist fuer alle gleich:
Ethe interface used is the same for all of them:
Dschied, dass die Spritefarbe 0 als fuer den Schatten durchsichtig betrach-
Ethat sprite color 0 is treated as being transparent for shadows
DSprungleiste zu @Sprite_fertig
Ejump-rail to @Sprite_fertig
DPlane3 = x,x,r,x,b,x
Eplane3 = x,x,r,x,b,x
DPlane2 = r,x,g,x,g,x
Eplane2 = r,x,g,x,g,x
DPlane1 = x,x,r,x,b,x
Eplane1 = x,x,r,x,b,x
D013E: OUT DX,AL ;Speichers=lineares Bitfeld
E013E: OUT DX,AL ;as a linear field of bits
D0135: OUT DX,AL ;adressierung von Daten im Bild-
E0135: OUT DX,AL ;addressing scheme of
DSpritenummer1
Espritenumber1
Dumgekehrt
Evice versa
D- maximaler Umfang aller Sprites zusammen nur durch Hauptspeicher begrenzt
E- maximal size of all loaded sprites only restricted by available memory
DRoutine nur fuer den Hintergrundmodus STATIC sinnvoll!
Ethis routine only makes sense when using mode STATIC!
Dmodus SCROLLING sinnvoll
Eas background mode!
DPROCEDURE
EPROCEDURE
DTRUE
ETRUE
D0115: MOV AL,02 ;(=Map-Maske)
E0115: MOV AL,02 ;register 2 (=Map-mask)
D010B: INC DX ;Dessen Daten ueber das zuge-
E010B: INC DX ;Read in its data, using the
Dx1,y1,x2,y2 = Koordinaten zweier Punkte,
Ex1,y1,x2,y2 = coordinates of two points,
DSpritenummer2*2
ESpritenumber2*2
DSpritenummer1*2
Espritenumber1*2
DSpritepositionsnummer*2
Espritepositionnumber*2
D41 DB 0 ; Modusnummer fuer Sprite
E41 DB 0 ; display mode used for sprite
DAdressen der temporaeren Variablen fuer die Kollisionspruefroutine:
Eaddresses of temporary variables for the collision detection routine:
Doder Err_NoSprite!
Eor Err_NoSprite!
D=GraphTextColor, so werden nur die Textpixel gezeichnet
Ethis value equals GraphTextColor, only the text-pixels
DVGA Identify-Adapter-Function unterstuetzt?
EVGA's identify-adapter-function supported?
DRGB-Anteile der Farbe, fuer die eine Naeherung zu finden ist
ERGB-parts of the color, for which we are seeking an approximation
DYTiles
EYTiles
DXTiles
EXTiles
DDer Punkt wird NICHT sofort sichtbar, sondern erst nach einem Anima-
EThe pixel will NOT be visible until the next animation cycle takes
DRealisiere "AX:=Offset_Adr[pa]":
Erealize "AX:=Offset_Adr[pa]":
Dmax_breite_in_4er
Emax_width_in_groups_of_4
Dwar, kommt hierher
Ebytes is placed here
Dnach Plane 3 kommt wieder Plane 0, aber
Eplane 0 follows after plane 3 again, but
DVariablen <>0 gesetzt worden, d.h.: ist der Ausschnitt _ganz_ ausser-
Ewill be set to something other then 0, that is: if the window lies
DKachelnspeicher
Etile memory
Dja, kein Treffer
Eyes, no collision
Dja, also sicherlich kein Treffer
Eyes, thus: surely no collision
D- arbeitet mit virtuellen Koordinaten im Bereich -16000..+16000, daher
E- works with virtual coordinates in the range -16000..+16000, thus
DPalette-Speicher
Epalette memory
Dabkuerzen
Etake short-cut
Dab hier: Hintergrund aus Kacheln zusammensetzen
Enow: create background image from tiles
Dabgeschnitten
Eoffscreen
DModus 1 schreibt die Daten sofort ohne weitere Untersuchung auf den Schirm
Emode 1 writes the data directly to the screen, without further processing
DStartVirtualX
EStartVirtualX
Dx,y
Ex,y
D%1110
E%1110
D#190
E#190
D#180
E#180
D#170
E#170
D#160
E#160
D#150
E#150
D#140
E#140
D#130
E#130
D#10
E#10
DC=1, wenn leftcut=0
EC=1, if leftcut=0
D0123: MOV AX,DI ;(wg. den 4 Bitplanes) auf 0
E0123: MOV AX,DI ;(because of chaining the 4 planes)
D011C: MOV AX,A000 ;Ab Segment $A000
E011C: MOV AX,A000 ;In segment $A000
Dy2un+y2 (=b)
Ey2un+y2 (=b)
Dx2re[Zeile]+x2 (=b)
Ex2re[row]+x2 (=b)
DAX:=y1ob+y1 (=c)
EAX:=y1ob+y1 (=c)
DAX:=x1li[Zeile]+x1 (=c)
EAX:=x1li[row]+x1 (=c)
D"Treffer!" nur dann ausgeben, falls auch mind. 1 Treffer in Y-Ri. existiert
Ereport "collision!" only, if there is at least 1 collision in Y-dir., too
Dnen Bitplanetabellen natuerlich mit diesen verbunden bleibt und deshalb
Eare (and remain) linked to these; therefore, they will be swapped too
DSatz des Pythagoras
EPythagorean proposition
Dwas_cut = TRUE/FALSE, falls ein zurechtstutzen des Bildausschnittes
Ewas_cut = TRUE/FALSE, if it was necessary/not necessary to clip the
Ddann in der Tabelle SPRITEAD[number] abgelegt; sind mehrere Sprites
Eare then stored in table SPRITEAD[number]; if more than one sprite
DZahl der bisher eingelesenen Sprites
Enumber of sprites already read in
DFarbe des Punktes
Ecolor of the point
Dmax. Anzahl an gleichzeitig geladenenen Sprites
Emax. number of simultaneously active sprites
Dja, Linie ganz innerhalb des Windows
Eyes, line is completely inside the window
Dja, Linie ganz ausserhalb des Windows
Eyes, line is completely outside the window
Din den Hintergrundspeicher uebernommen wird, d.h.: er ist nur
Eover into the background image, that is: it will be visible
Dund die umgebenden Pixel unveraendert gelassen (=nor-
Ethemselves will be drawn while the surrounding ones
DAnzahl zu uebertragender Woerter
Enumber of words to move
DIn anderen Worten: dieser Modus entspricht dem Modus 2, mit dem Unter-
EIn other words: this mode is equivalent to Modus2, with the exception
Dvon
Efrom
Dvon unten nach oben
Efrom bottom to top
Ddown
Edown
DFolge (Planes abwechselnd von oben nach unten lesen!
Esequence (alternately read planes from top to bottom!
DCohen-Algorithmus verwenden: 4 Bit-Code fuer links|rechts|oben|unten
Euse 4 bit-codes for: left|right|top|bottom
DSoll der Zyklus aus nicht direkt aufeinanderfolgenden
EIf the sprite cycle shall consist of (physical) sprites
Dkollidieren -> FALSE zurueckgeben
Eeither -> return FALSE
DFortsetzung von Modus2 - all das, was nicht mehr in 16 Bytes unterzubringen
EContinuation of mode2 - everything, which didn't fit in the reserved 16
DCohen-Algorithmus verwenden: 4 Bit-Code: links|rechts|oben|unten
Euse 4 bit-codes for: left|right|top|bottom
DCodesegment zu haben
Ethe code segment, too
DPointer auf zugehoerige Routine holen
Eget pointer to according routine
Dmoegliche Textausgaberichtungen
Epossible text directions
DModusbyte des Sprites holen
Eget mode byte of the sprite
DKorrekturfaktor fuer Zeilenzieladressen
Eadjustment for row target addresses
DKorrekturfaktor fuer Zeilenadressen
Eadjustment for row addresses
DKorrekturfaktor fuer Tilezeilenquelladressen
Eadjustment for source addresses of the tiles
DKopie von X in BX aufbewahren
Ehave a copy of X in BX
DKopie von leftcut in BX aufbewahren
Ehave a copy of leftcut in BX
DHoehe von Sprite2 in Punkten
Eheight of sprite2 in points
DHoehe um evtl. oberen cutoff korrigieren
Eevtl. adjust height for upper cutoff
DHoehe (in Zeilen)
Eheight (in rows)
Dmordsmaessige Abweichungen sofort ignorieren
Edon't tolerate huge color differences
DFortsetzung von Modus3 - all das, was nicht mehr in 16 Bytes unterzubringen
Econtinuation of Modus3 - everything, which didn't fit into 16 bytes
DMode-control-Register auswaehlen
Eselect mode control register
DS.o.: Sequenzerregister2 (=Map-Maske) waehlen,...
Es.a.: address sequencer reg. 2 (=map-mask),...
DStartVirtualY
EStartVirtualY
D%1101
E%1101
D%1011
E%1011
D#191
E#191
D#181
E#181
D#171
E#171
D#161
E#161
D#151
E#151
D#141
E#141
D#131
E#131
D#11
E#11
D#1
E#1
Dx1
Ex1
Dy1
Ey1
D11.
E11.
Ds1
Es1
Doder direkt :=$41
Eor directly :=$41
DDX:=y2ob+y2 (=d)
EDX:=y2ob+y2 (=d)
DDX:=x2li[Zeile]+x2 (=d)
EDX:=x2li[row]+x2 (=d)
DAX:=-x1old
EAX:=-x1old
Dfalls Wert
Eif value
Dlaubt, so geschieht nicht!
Enothing will happen at all!
DDabei wurde NICHT auf irgendwelche Retrace-Signale synchronisiert
EThe routine does NOT synchronize on any retrace-signal
DDabei wird auf die Darstellung der Seite 1-PAGE geschaltet
EThe display will be switched to graphic page 1-PAGE
DTabelle der Startadressen der 3 Routinen im Codesegment
Etable with the starting addresses of the 3 routines in the code segment
Dhat sich um 1 Byte erhoeht
Ehas increased by 1 byte
DFarbwert fuer den zu zeichnenden Punkt
Ecolor value for the pixel to be drawn
DPalette wurde uebernommen und evtl. ShadowTab neuberechnet
Epalette has been set and evtl., ShadowTab has been recomputed
DBP
EBP
Dunterstuetzte Darstellungsmodi der Sprites:
Esupported display modes for sprites:
DDI setzen, damit Stringbefehle verwendet werden koennen
Eset DI so that the string instructions can be used
DSI auf naechste Tilequellzeile setzen
Eset SI to next tile's source addr.
DSI auch zuruecksetzen
Ereset SI, too
DDI wieder auf Ursprungsadresse zuruecksetzen
Ereset DI to the source address
DDI und SI wieder zuruecksetzen
Ereset DI and SI registers
DDI auf naechste Zielzeile setzen
Eset DI to next destination row
DDI auf naechste Zeile setzen
Eset DI to next row
Dvon ANIMATE auszufuehren, da der gezeichnete Punkt sonst so-
Ecalling ANIMATE, because otherwise, your drawn pixel will
D#192
E#192
D#182
E#182
D#172
E#172
D#162
E#162
D#152
E#152
D#142
E#142
D#132
E#132
D#12
E#12
D(16+3-i-rightcut) SHR 2
E(16+3-i-rightcut) SHR 2
D(16+3-i-leftcut) SHR 2
E(16+3-i-leftcut) SHR 2
D0112: MOV DX,03C4 ;S.o.: Sequenzer-Register 2
E0112: MOV DX,03C4 ;s.a.: address sequencer-
Dymax
Eymax
Dxmax
Exmax
DAX:=y1ob[Spalte]
EAX:=y1ob[column]
Dbzw.
Eor
DJetzt die unteren Tiles, die nicht seitlich abgeschnitten sind:
ENow the lower tiles, which are not partially cut at their left or right:
Dgenau dasselbe fuer unteren Bildschirmrand
Eexactly the same for the lower screen border
Dred
Ered
Dtet wird!
Etoo!
DZeiger auf per GetImage() gespeichertes Bild
Epointer to image memory, allocated by GetImage()
Dend_min_start
Eend_min_start
Din den Hintergrund gezeichnet (sofern er im sichtbaren Bereich liegt)
Ehas been drawn into the background (if it is onscreen)
Dinaktive Sprites koennen auch nicht
Einactive sprites can't collide
Dentscheidet, welcher Alg. Anwendung findet
Edetermines, which algorithm will be used
DAnfangsadressen der 4 Bitplanes berechnen; dabei evtl. linken cutoff mit
ECompute starting addresses of the 4 bitplanes; take into account evtl.
Dund gezeichnet (sofern er auf dem sichtbaren Bildschirmfenster liegt)
Eand has been drawn (if it lies within the visible window)
Dentsprechenden Eintraege in NextSprite[] manuell gemacht
Ehave to make the appropriate entries into NextSprite[]
Denthaelt jetzt den Gebietscode fuer Punkt
Eholds the area code for point
Dunter diesen Punkten befindet, wird gegen den korrespondierenden Farbwert
Eunderneath these pixels will be replaced by the corresponding color entry
DSpritenummer, dessen Modusbyte abgefragt werden soll
Esprite number, which mode byte shall be read out
DSpriteY_virtuell
ESpriteY_virtual
DSp = SpriteLADEnummer, dessen Modusbyte veraendert werden soll
ESp = spriteLOADnumber, which mode byte shall be changed
D#193
E#193
D#183
E#183
D#173
E#173
D#163
E#163
D#153
E#153
D#143
E#143
D#133
E#133
D#13
E#13
D0100: MOV AX,0013 ;Mit BIOS Grafikmodus $13
E0100: MOV AX,0013 ;Use BIOS to switch to
D(Segment-)Quelladresse ist die Seite SCROLLPAGE
E(segment part of) source addr. is page SCROLLPAGE
D*2, da Word-Werte!
E*2, because word-sized!
Dy2ob[Spalte]
Ey2ob[column]
DDiese Routine dauert ihre Zeit (ca. 4 sec auf 8MHz-AT!)
EThis routine takes some time (about 4 sec on a 8MHz-AT!)
DDisplay_FAST
EDisplay_FAST
DDisplay_SHADOWEXACT
EDisplay_SHADOWEXACT
Dberechne
Ecompute
Dwelche Schreib-Plane
Ewhich write plane
Dwenn topcut=0 ist, braucht die oberste
Eif topcut=0, the upper tile row doesn't
Dwenn leftcut=0 ist, muss die linke obere
Eif leftcut=0, the upper left corner does
Dnein, kopiere die Routine an die
Eno, copy routine to all places
Djetzt gilt: (pl_adr?,breite?) enthalten die Source-
Eprecondition here: (pl_adr?,breite?) contain the
Dgestutzt; sollte die Gerade keinen sichtbaren Teil besitzen, so wurde
Eif the line is completely offscreen, the program jumped directly to
Dges Minimum ist die Farbe j der neue
Eminimum, then the new color j will be
Dgelesen, die sich an der Spriteposition befinden und deren Farbwerte
Eposition is read in and these color values will be exchanged against
Dden musste
Eoff
Dbereits aktiv ist, deshalb wurden sie
Euntil a graphic mode has been activated;
Dferten Werte!
Ethe results supplied by GetImage!
DUebertrag bedeutet sofortiges Ende
Ecarry set means: end at once
DZeiger auf erstes zu kopierendes Tilebyte
Epointer to first tile byte to copy
DSegmentadresse der Hintergrundseite
Esegment address of background page
Dder Hintergrundseite
Ein the background page
Dnein, naechste Spalte (-> Word-Werte!)
Eno, next column (-> word-sized values!)
DJetzt evtl. noch die untere rechte Eck-Tile:
ENow evtl. the lower right corner-tile remains to be drawn:
Djede Kachelzeile ist XTiles breit, jede Kachel 16x16 Punkte
Ea tile row has width XTiles, each tile consists of 16x16 points
DLeseplane
Eplane to read from
Drechte
Eright
DZeile
Erow
DRealisiere "AX:=Offset_Adr[Page]":
Erealize "AX:=Offset_Adr[Page]":
Dneue, aktuelle Grafikseite(nadresse)
Enew, actual graphic page(address)
Dgerade aktuellen Farben "ActualColors" gesetzt; die Palette wurde
Ewill become set to the actually set colors of "ActualColors"; the
Dgerade aktuelle Farbpalette
Eactually set color palette
DTrick damit Code relokatibel wird!
Etrick to make code relocatible!
Din der Farbe COLOR in den Hintergrundspeicher gezeichnet; die Rou-
E(using the color COLOR) into the background page; the routine it-
DAb Segment A000h nun 8000h logische Woerter=
Estarting in segment A000h, set 8000h logical
D50..?? DB Daten
E50..?? DB data
D10..11 DW Hoehe in Zeilen
E10..11 DW heigth in rows (in German: "Hoehe")
DAchsen- und Punktsymmetrie ausnutzen
Euse axial- and point symmetrie
DSchreibplane anwaehlen
Eselect write plane
DSchreibmodus 0 waehlen
Eselect write mode 0
DSchrittweite beim laden
E"step" needed for correct addressing
DEcke nicht gesondert gezeichnet werden
Enot need to be drawed separately
DAchtung! Die Werte koenn(t)en nur dann
EAttention! These values can/could be
DSchreib-Plane anwaehlen
Eselect write plane
DSchreibplane 3 waehlen
Echoose write plane 3
DSchreibplane 2 waehlen
Echoose write plane 2
DSchreibplane 1 waehlen
Echoose write plane 1
DSchreibplane 0 waehlen
Echoose write plane 0
DSchreibmodus 1 waehlen
Echoose write mode 1
DSchreibmodus 0 setzen
Eset write mode 0
DSchleife wird genau "tiles" mal durchlaufen
Eloop will be taken exactly "tiles" times
DactIndex fuer naechste Tilezeile justieren:
Eadjust actIndex for next tile-row:
DSchatten
ESchatten
Dthen [ endy:=199-SpriteY
Ethen [ endy:=199-SpriteY
D..14)
E..14)
D#194
E#194
D#184
E#184
D#174
E#174
D#164
E#164
D#154
E#154
D#144
E#144
D#14
E#14
D#134
E#134
D0119: MOV AL,0F ;...und Zugriff auf alle 4
E0119: MOV AL,0F ;...and allow access to all
DSucc(XMAX)
ESucc(XMAX)
DSucc(YMAX)
ESucc(YMAX)
D320
E320
DAX:=hoehe1+hoehe2-(maxy-miny+1)-1 (=ueberlappy-1)
EAX:=hoehe1+hoehe2-(maxy-miny+1)-1 (=ueberlappy-1)
DCX:=breite1+breite2-(maxx-minx+1)-1 (=ueberlappx-1)
ECX:=breite1+breite2-(maxx-minx+1)-1 (=ueberlappx-1)
D#250
E#250
D#240
E#240
D#230
E#230
D#220
E#220
D#210
E#210
D#200
E#200
D#20
E#20
Dzeigt noch auf Spritedaten, muss aber auf
Estill points to sprite data, but must
DZeiger auf
Epointer to
DGrafikzeile
Egraphic row
DErr_InvalidFade, falls nicht zulaessiger Alg. gewaehlt wurde
EErr_InvalidFade, if illegal "style" value has been used
DGroesse einer Bitplane
Esize of one bitplane
Dwrap in den Bitplanes bedeutet: Startadresse
Ewrapping the bitplane means: start address
DBreite einer Zeile fuer die erste, zweite,
EWidth of a row for the first, second,
Ddritte und vierte Bitplane
Ethird and fourth bitplane, respectively
DBreite
Ewidth
DBreite dieser Zeile
Ewidth of this line
DGrafikseite
Egraphic page
DGraphTextColor=Textfarbe
EGraphTextColor=color for text
DZeitueberwachung explizit ab, so wird das durch IsAT:=$80,
Eof 0 milliseconds), this will result in IsAT:=$80, that is
DSegmentadressen der Grafikseiten (bei Offset = 0) :
Esegment addresses of graphic pages (with offset = 0):
DFehlerquadrat = 0?
Esquare of error = 0?
DErsatz fuer "LOOP @outerloop"; naechste Farbe!
Ereplacement for "LOOP @outerloop"; next color!
Dcolor
Ecolor
Dnoetig war/nicht noetig war
Efetched image
Dwo und wieviel des Bildes abgeschnitten wer-
Eand how much of the image had to been clipped
Dnommen, d.h.: er ist nur einen Animationszyklus lang sichtbar!
Eimage, that is: it will be visible only for one animation cycle!
Dnoch mit derselben Adresse ansprechbar?
Estill addressable with the same address?
Dkommt spaeter
Ecomes later
DColor
EColor
Dkoennte auch ausgerechnet werden ueber:
Ecould also be computed by:
DSpritebyte holen
Efetch sprite byte
DSprungleiste fuer NOHIT (passt hier gut hin)
Ejump-rail for NOHIT (this is a good place)
DSpritepositionsnummer*2 retten
Esave spritepositionnumber*2
DSpriteheader auf Heap bringen
Estore sprite header to heap
DSprite noch nicht geladen
Esprite not yet loaded
DSprite muss schon geladen sein
Esprite must already be loaded
DSprite kann sich nicht selbst treffen
Esprite can't collide with itself
DSpeicher auf dem Heap besorgen
Eget memory from the heap
DSpritedaten
Esprite data
DSpritedatum holen...
Eget sprite data...
D#195
E#195
D#185
E#185
D#175
E#175
D#165
E#165
D#155
E#155
D#15
E#15
D#145
E#145
D#135
E#135
DBX so verringern, dass es zusammen mit SI zugleich
Echange BX such that (together with SI) it can be
DDX=3CEh
EDX=3CEh
DDX=3C4h
EDX=3C4h
D12..15 DB 1,2,4,8 ; Translate-Tabelle fuer Port-Ansteuerung
E12..15 DB 1,2,4,8 ; translate-table used for port-accesses
DAX:=Kachel*64 =Kachel SHL 6 =(Kachel SHL 8) SHR 2
EAX:=tile*64 =tile SHL 6 =(tile SHL 8) SHR 2
DCX (BX) = Spritenummer von Sprite 1 (2)
ECX (BX) = spritenumber of sprite 1 (2)
Dx2+breite2-1
Ex2+breite2-1
D#251
E#251
D#241
E#241
D#231
E#231
D#221
E#221
D#211
E#211
D#21
E#21
D#201
E#201
Dnein: geringe Steigung
Eno: small slope
Dueberhang
Eoverhang
DAendern von Spritedarstellungsmodi waehrend der Laufzeit, Geschwindig-
Echanging sprite display modes at runtime, adjustment for different
Dmaxx
Emaxx
Dmax
Emax
Drerand1
Ererand1
Dgelesen werden muessen: 0 = Planereihenfolge (1,2,3,4); 1=(2,3,4,1);
Eof the heap: 0 = plane order (1,2,3,4); 1 = plane order (2,3,4,1);
Dueberlappy-1
Eueberlappy-1
Dkein MOVSW, da Writemode 1!
Eno MOVSW, as we use write mode 1!
Dkein "MOVSW", da Writemode1!
Eno "MOVSW", as we use write mode1
Dkeine "MOVSW", da Writemode1!
Eno "MOVSW", as we use write mode1
DName des zu ladenden Sprite-Files (Typ: "*.COD" / "*.LIB" )
Ename of the sprite file to load (type: "*.COD" / "*.LIB")
Dabsolut
Eabsolute
Dob die Sprites z.Z. gerade sichtbar sind oder nicht.
Evisible (=onscreen) or not!
Dabsolut!
Eabsolute!
D- beliebiges Hintergrundbild, vor der die Animation geschieht
E- arbitrary background image for the animation
DPortadresse des Statusregisters
Eport address of state register
DPortadresse des CRT-Adressregisters
Eport address of CRT-address register
DDI=Zielzeiger:=(bildschirmstartx+0) DIV 4 +zeilenadr
EDI=dest.ptr:=(ScreenStartX+0) DIV 4 +zeilenadr
DSI = index = Tilenummer
ESI = index = tile number
DPICHeader
EPICHeader
Dsowie evtl. notwendige Clipping-Schritte aus.
Eclipping actions.
DKoordinaten des def. Bereiches
Ecoordinates of the defined area
Dkoennte auch berechnet werden (fuer x>xmax-16) gemaess
Ecould also be computed (for x>xmax-16) by
D#196
E#196
D#186
E#186
D#176
E#176
D#166
E#166
D#16
E#16
D#156
E#156
D#146
E#146
D#136
E#136
DDisplay_NORMAL, Display_FAST oder Display_SHADOW
EDisplay_NORMAL, Display_FAST or Display_SHADOW
DDisplay_SHADOW
EDisplay_SHADOW
D#252
E#252
D#242
E#242
D#232
E#232
D#222
E#222
D#22
E#22
D#212
E#212
D#202
E#202
D#2
E#2
Dy2
Ey2
Dx2
Ex2
D12.
E12.
Ds2
Es2
DNextSprite[] wurde so gesetzt, dass jedes Sprite sein eigener Nach-
ENextSprite[] has been set in such a way that every sprite is its
Dneuer PAGE-Wert := 1-alter PAGE-Wert, d.h.:
Enew PAGE-value := 1-old PAGE-value, that is:
Dgewuenschte Helligkeit der Farben im Schattenbereich,
Ewanted brightness for the colors in the shadow area,
D32..33 DW ? ; | x2
E32..33 DW ? ; | x2
Dmaxy
Emaxy
Dermitteln, ob Farb- oder Monochromdarstellung
Esee if we are using color-/monochorme display
D(etwas spaeter wird dann DS (ES) = Segment der Spr.daten von Spr.1 (2) )
E(a bit later, DS (ES) becomes segment addr. of sprite data of spr. 1 (2) )
Dweitergesetzt: liefert (richtige) (4,8,12,...)
Erection of +1 byte: this results in (4,8,12,...)
D= (endy-starty)*2 =Yaktuell*2
E= (endy-starty)*2 =Yaktuell*2
DSegment der Spritedaten2
Esegment of 2nd sprite's data
Drerand2
Ererand2
D[end_min_start] = (endy-starty)*2 =Yaktuell*2
E[end_min_start] = (endy-starty)*2 =Yaktuell*2
Dendx
Eendx
Dendx-startx
Eendx-startx
Dorand1
Eorand1
Durand1
Eurand1
Dbreite1+breite2-(maxx-minx+1)
Ebreite1+breite2-(maxx-minx+1)
DAnzahl Bytes um 1 erhoehen (wg. LODSB)
Einc. number of bytes by 1 (-> LODSB!)
Dvon links nach rechts/umgekehrt
Efrom left to right/vice versa
Dvon oben nach unten/umgekehrt
Efrom bottom to top/vice versa
Dbottom_cut
Ebottom_cut
Dtop_cut
Etop_cut
DVIRTUELLE Punktkoordinaten des zu zeichnenden Punktes
EVIRTUAL pixel coordinates of the point to be written
DVIRTUELLE Punktkoordinaten des auszulesenden Punktes
EVIRTUAL pixel coordinates of the point to be read
DSoll von der gerade SICHTBAREN Seite gelesen werden, so ist
EIf you want to read from the actually VISIBLE page, then
DSoll auf die gerade SICHTBARE Seite gezeichnet werden, so ist
EIf you want to draw at the actually VISIBLE graphic page
Dfort wieder verschwindet!)
Evanish at once!)
Dfolger ist
Eown successor
DKonstanten fuer Hintergrundart
Econstants for background mode
Dyoffset
Eyoffset
Dtopcut
Etopcut
Dbottomcut
Ebottomcut
Dsonst wird BP von TP wiederhergestellt
Eelse, BP will be restored by TP itself
Dup
Eup
DSp
ESp
D0131: INC DX ;Wert aus zugehoerigem
E0131: INC DX ;read out value of its
D#197
E#197
D#187
E#187
D#177
E#177
D#17
E#17
D#167
E#167
D#157
E#157
D#147
E#147
D#137
E#137
D#127
E#127
D0..255 = Tilenummer fuer das erste Sprite der Datei
E0..255 = tile number for the file's first sprite
Dlicutoff_in_Punkten:=-SpriteX]
Elecutoff_in_points:=-SpriteX]
D#253
E#253
D#243
E#243
D#233
E#233
D#23
E#23
D#223
E#223
D#213
E#213
D#203
E#203
D1,2,4,8 fuer BX=0,1,2,3
E1,2,4,8 for BX=0,1,2,3
D(etwas frei:)
E(a bit lax:)
Dneue_Tabelle[i]
Eneue_Tabelle[i]
DAL=100h-DL = beste Naeherung
EAL=100h-DL = best approximation
DDefaultfarbpalette des Modus $13
Edefault color palette of mode $13
DAH:=BackTile[index]
EAH:=BackTile[index]
DTHEN index:=0 ELSE index:=actIndex
ETHEN index:=0 ELSE index:=actIndex
Din: (0,y) =
Ein: (0,y) =
Din: (x,y) = (
Ein: (x,y) = (
Din: (x,y) =
Ein: (x,y) =
Dendy
Eendy
DCL enthaelt den Gebietscode fuer Punkt 2, CH den fuer Punkt 1
ECL holds the area code for point 2, CH the one for point 1
Dorand2
Eorand2
Durand2
Eurand2
DGrafikseite, von der der Ausschnitt zu sichern ist (0..2)
Egraphic page from which the image should be taken (0..2)
DGrafikseite, auf der gezeichnet werden soll (0..2)
Egraphic page to be drawn upon (0..2)
Dif bildschirmstartx>xmax then skip_zeile
Eif ScreenStartX>xmax then skip_zeile
DOffsetanteil der Startadresse
Eoffset part of the start address
DDI:=orand2+2*hit2xfirst
EDI:=orand2+2*hit2xfirst
D10 Bytes Platzhalter
E10 bytes to fill up
D<0 bedeutet: neue Farbe waere heller!
E<0 means: new color would be brighter!
D40 DB 1 ; Versionsnummer
E40 DB 1 ; version number
DactIndex:=(ytil-1)*XTiles-1, "+xtil" kommt spaeter
EactIndex:=(ytil-1)*XTiles-1, "+xtil" follows later
Dy1 in absolute Koordinaten umrechnen
Etransform y1 into absolue coordinates
Dx1 in absolute Koordinaten umrechnen
Etransform x1 into absolue coordinates
D0139: OUT DX,AL ;auswaehlen
E0139: OUT DX,AL
D0136: DEC DX ;schirmspeicher durchfuehren
E0136: DEC DX ;video data
D0132: IN AL,DX ;Datenregister auslesen
E0132: IN AL,DX ;data register
D0130: OUT DX,AL ;auswaehlen
E0130: OUT DX,AL
D012B: MOV DX,03D4 ;CRT-Controller ansteuern
E012B: MOV DX,03D4 ;address CRT-controller
D0125: MOV CX,8000 ;setzen
E0125: MOV CX,8000 ;to 0
D011B: OUT DX,AL ;Bitmaps erlauben
E011B: OUT DX,AL ;4 bitmaps
D0117: OUT DX,AL ;auswaehlen,...
E0117: OUT DX,AL
D0111: OUT DX,AL ;Neuen Wert wirksam machen
E0111: OUT DX,AL ;tell it to the VGA card
D010F: OR AL,04 ;Bit 2:=1:kein odd/even-Mechan.
E010F: OR AL,04 ;bit 2:=1:no odd/even-mechanism
D010D: AND AL,F7 ;Bit 3:=0:4 Planes nicht chainen
E010D: AND AL,F7 ;bit 3:=0:don't chain bitplanes
D010C: IN AL,DX ;hoerige Datenregister einlesen
E010C: IN AL,DX ;appropriate data register
D010A: OUT DX,AL ;auswaehlen
E010A: OUT DX,AL ;for the VGA's memory management
D0103: INT 10 ;(=320x200x256) setzen
E0103: INT 10 ;mode $13 (=320x200x256)
D"11b" werden also beim Rechtsschieben eh abgeschnitten!
E"11b" will be cut off while shifting right, anyway!
D0..1 DW Plane_0_Daten
E0..1 DW offset_ptr_to_plane0_data
D#198
E#198
D#188
E#188
D#18
E#18
D#178
E#178
D#168
E#168
D#158
E#158
D#148
E#148
D#138
E#138
D#128
E#128
Dadresse um 1 Byte weitergesetzt werden
Eing address must be incremented by 1 byte
D(d.h.: nicht abgeschnittene) Tiles zeichnen:
E(that is: all non-cut) tiles:
DAdressen der temporaeren Variablen fuer die Zeichenroutinen:
Eaddresses of temporary variables for the drawing routines:
D--- da Abkuerzung genommen wurde: WriteMode 0 wieder setzen!
E--- short cut has been taken: thus, reset write mode 0!
D#254
E#254
D#244
E#244
D#24
E#24
D#234
E#234
D#224
E#224
D#214
E#214
D#204
E#204
Ddazu DI um (zu zeichnende Zeilen)*LINESIZE
Ethus, decrement DI by (rows to draw)*
DBreite fuer diese Zeile in Punkten +3
Ewidth of this row in pixels +3
D#30
E#30
Dif
Eif
DOffsetadressen der Grafikseiten (in Segment $A000):
Eoffset addresses of the graphic pages (in segment $A000):
Dist globale Variable
Eis a global variable
D200 Zeilen zu je 320/4 Bytes
E200 rows at 320/4 bytes each
DScrollRange definierten Bereiches liegen, erhalten TileNr als
ESetBackgroundScrollRange will become the tile TileNr as
DSchatten: Farbumsetzung anhand des Hintergrundes
Eshadow : color lookup driven by background data
Dschritte aus.
Eclipping actions.
DSchreibmodus
Ewrite mode
DActualColors
EActualColors
Dschneller als
Efaster than
DSpaltenzaehler
Ecolumn counter
DSpriteLADEnummer
EspriteLOADnumber
DSpriteN[?]=Spriteladenummer
ESpriteN[?]=Spriteloadnumber
DSpriteladenummer
Esprite load number
D#199
E#199
D#19
E#19
D#189
E#189
D#179
E#179
D#169
E#169
D#159
E#159
D#149
E#149
D#139
E#139
D#129
E#129
DCX=breite2 brauchen wir spaeter nochmal
ECX=breite2 will be needed later again
D#255
E#255
D#25
E#25
D#245
E#245
D#235
E#235
D#225
E#225
D#215
E#215
D#205
E#205
Dnein, alles ok
Eno, everything ok
DBP:=2*DY-DX
EBP:=2*DY-DX
D(Yaktuell+starty)*2
E(Yactual+starty)*2
D#31
E#31
DoffscreenFlag
EoffscreenFlag
Drbgbrxxx
Erbgbrxxx
Dist es gleich 0?
Eis it zero?
Dist leftcut=0 <=> rightcut=0
Eleftcut=0 is equivalent to rightcut=0
D>=0, quadrieren (um Differenzquadrat
E>=0, square it (we are going to
D"0" als Ergebniswert zurueckgeliefert
Ewill return "0" as the result
D20..21 DW ? ; zeilenadr | hit1yfirst
E20..21 DW ? ; zeilenadr | hit1yfirst
DSpritenummern der darzustellenden Sprites
Espritenumber of sprite to be displayed
Dgeht, weil
Eworks, because
DSeite, deren Inhalt sichtbar gemacht werden soll
Epage, which contents will be made visible
DZeit in Millisekunden, in der dies geschehen soll
Etime in milliseconds for this action
DSeite, die auf die aktuelle Seite eingeblendet werden soll
Epage which shall be faded onto the actually visible page
D#26
E#26
D#246
E#246
D#236
E#236
D#226
E#226
D#216
E#216
D#206
E#206
Ddessen Modusbyte abgefragt werden soll
Ewhich mode byte shall be determined
Ddefinierten Bereiches in "x" mittels der Formel:
Ethe defined area and store it to "x", formula:
Dder Routine nur fuer den Hintergrundmodus STATIC sinnvoll!
Eroutine only makes sense when using background mode STATIC!
Dwerden soll
Eread out
DSeite, auf der gezeichnet werden soll
Epage to be drawn upon
DMethode, mit der Sp ab sofort dargestellt werden soll:
Emethod, which shall be used to display Sp from now on:
Dneuer Rotanteil
Enew red part
DProgrammtool zur Realisierung schneller Animationen auf der VGA-Grafik-
EProgramtool for the realization of fast animations on the VGA-graphic-
DZeitmechanismus geht nur auf AT/386
Etiming mechanism only works on AT/386
DSpriteN[],SPRITEAD[] wurden auf "gaenzlich leer" initialisiert
ESpriteN[],SPRITEAD[] have been initialized to "completely empty"
Dauch nach [yoffset_]
Estore it in [yoffset_], too
DDX=3CEh -> Leseplane 3 waehlen
EDX=3CEh -> choose read plane 3
DDX=3CEh -> Leseplane 1 waehlen
EDX=3CEh -> choose read plane 1
DDX=3C4h -> Schreibplane setzen
EDX=3C4h -> set write plane
DCX=[licutoff_]= licutoff_in_Punkten,
ECX=[licutoff_]= licutoff_in_points,
DCX Bytes von DS:SI nach ES:BX uebertragen
Ecopy CX bytes from DS:SI to ES:BX
DAX Zeilen unten abschneiden
Ecut off AX rows at the bottom
DAX Punkte rechts abschneiden
Ecut off AX points at the right
DCX=[licutoff_] = licutoff_in_Punkten
ECX=[licutoff_] = lecutoff_in_points
DAX:=0 setzen
Eset AX:=0
DRetracesignal und schaltet dann auf die so fertiggestellte Seite um.
Eretrace signal and then flips display to this completed page.
D#27
E#27
D#247
E#247
D#237
E#237
D#227
E#227
D#217
E#217
D#207
E#207
Drem:
Erem:
Djetzt wieder normales Programm
Enow back at "normal" program
DArt, wie das geschehen soll
Ethe way how this shall be done
DGrafikseite(nsegment), aus der gelesen werden soll
Egraphic page(segment) to be read from
DGrafikseite(nsegment), auf der gezeichnet werden soll
Egraphic page(segment) to be drawn upon
DGrafikseite, in die der Bildausschnitt kopiert werden soll
Egraphic page to which the cutting shall be pasted to
DGrafikseite (0..3), auf der gezeichnet werden soll
Egraphic page (0..3) to be drawn upon
DGrafikseite, auf der der Text ausgegeben werden soll
Egraphic page where the text shall be written
DGraphTextOrientation="vertical" oder "horizontal"
EGraphTextOrientation="vertical" or "horizontal"
DGroesse Vielfaches von 16?
Esize a multiple of 16?
D#3
E#3
D13.
E13.
DEs wurde eine Linie von den VIRTUELLEN Punkten (x1,y1) nach (x2,y2)
EA line has been drawn between the VIRTUAL points (x1,y1) and (x2,y2)
DOR
EOR
DStartVirtualX,StartVirtualY = 0 (d.h.: virtuelle = absolute Koord.)
EStartVirtualX,StartVirtualY =0 (that is: virtual = absolute coord.)
DSprite(header)aufbau:
Esprite header format:
D0/1, wenn PAGE vorher 1/0 war
E0/1, if PAGE has been 1/0, respectively
D0137: MOV AL,17 ;Mode-control-Register
E0137: MOV AL,17 ;select mode-control-register
D012E: MOV AL,14 ;Underline-location-Register
E012E: MOV AL,14 ;choose underline-location-register
D0121: SUB DI,DI ;4*$8000 physikalische Woerter
E0121: SUB DI,DI ;=4*$8000 physical words
D011F: MOV ES,AX ;$8000 logische Woerter=
E011F: MOV ES,AX ;clear $8000 logical words
D0108: MOV AL,04 ;das Speichermodus-Register
E0108: MOV AL,04 ;the register being responsible
Doder
Eor
Dy2 in absolute Koordinaten umrechnen
Etransform y2 into absolue coordinates
Dx2 in absolute Koordinaten umrechnen
Etransform x2 into absolue coordinates
Dp2 auf Segmentgrenze bringen
Emake p2 fall on segment boundary
D42..43 DW linke_Begrenzungen
E42..43 DW offset_ptr_to_left_boundary_data
Dletzte Spalte erneuern:
Eupdate last column:
Dneue Zeile sichtbar machen:
Emake new row visible:
DZeilen
Erows
DTeiler von
Edivisor of
D#28
E#28
D#248
E#248
D#238
E#238
D#228
E#228
D#218
E#218
D#208
E#208
Dnein, uebertragen
Eno, store to screen
Dzeugen, muesste diese Tabelle zu jeder Farbe eine dunklere enthalten)
Ethis table should hold a darker color for each of the original colors)
Dverwendet werden!
Efor other purposes!
Dverringern (N.B.: BX=zu zeichnende Zeilen)
ELINESIZE (N.B.: BX=number of rows to draw)
DDer Hintergrundspeicher BACKGNDPAGE wird mit dem Inhalt der an-
EThe background page BACKGNDPAGE has been filled with the con-
Drechtsschieben!
E2 bits to the right!
DJetzt wird keine Variable aus dem Stack mehr gebraucht: BP kann
ENow there is no further variable on stack, so BP can be used
DJetzt alle vollstaendig im Inneren des Bildschirms gelegenen
ENow draw all tiles which are completely onscreen
Dder Spritenummer zuordnen:
Eassign it to the sprite number:
Dbeste Naeherungswert: ihn selbst (in
Ethe new optimum: store that optimum
Dbei "was_cut"=TRUE darueber Auskunft geben,
Ebeen set to TRUE, they will report, where and
Dwerden
Eyourself manually
Dsein, sowie die Register BP,DS,ES unveraendert lassen!!!!!!!!!!!!!
ECATIBLE and MAY NOT CHANGE registers BP,DS and ES!!!!!!!!!!!!!!!!!
Drechts unten!
Eright corner to the lower right!
Dpermanent bleiben, so muss sie in den Hintergrund gezeichnet werden!)
Eit shall stay permanent, you have to draw it into the background!)
Dleft_cut= evtl. noetiger linker Cutoff des Bildausschnittes (gibt an,
Eleft_cut= evtl. needed left cut off of the image (this determines,
Ddes Hintergrundes "sofort" sichtbar werden!)
Ethe background will be visible "at once"!)
Ddes Animationspaketes aufgerufen werden
Ebeginning - for initializing the whole package properly
Dbezeichnet, liest diese Routine auch von dort die Punkte ein!
Ephic page, this routine will read from there, too!
Dbeim Aufruf als Seite "1-PAGE" anzugeben!
Ethen you must call the routine with pa=1-PAGE!
DAenderungen (durch ANIMATE) sofort sichtbar werden)
Echanges will become visible (via ANIMATE) at once)
DZeitueberwachung starten
Estart time control mechanism
DZeitueberwachung fuer naechsten Zyklus starten:
Estart time control mechanism for next cycle:
DZeilenzaehler verringern
Edecrease row counter
DZeilenzaehler retten
Esave row counter
DZeiger auf Farbumsetztabelle setzen
Eset pointer to color lookup table
DZeichenfarbe fuer Linien
Edrawing color for lines
DWert nicht mehr pushen!
Edo not push value again!
DSeitennummer muss 0..2 sein
Epage number must be 0..2
DDefaultwert in ShadowTab ist 70% Helligkeit der Ursprungsfarben!
Edefault value of ShadowTab is 70% of the original color brightness!
DText wurde auf dem Bildschirm ausgegeben
Etext has been written to the screen
Dden Fehler in Worten
Ethe error described in words
Dnein, Flag ruecksetzen
Eno, reset flag
Dnein, Adr. muss(te) um 1 erhoeht werden
Eno, address had to be incremented by 1
Dnein
Eno
DLese-Plane anwaehlen
Eselect read plane
DLesezugriff auf passende Plane ermoeglichen
Eenable read access for correct plane
DLeseplane 3 waehlen
Echoose read plane 3
DLeseplane 2 waehlen
Echoose read plane 2
DLeseplane 2 setzen
Eset read plane 2
DLeseplane 1 waehlen
Echoose read plane 1
DLeseplane 0 waehlen
Echoose read plane 0
DLesemodus 0 setzen
Eset read mode 0
DKennung in Bilderdateien
Etag in picture files
Dkein Treffer, wenn
Eno collision, if
DJetzt: "SpriteN[?]:=SpriteN[NextSprite[?]]" berechnen:
ENow: compute "SpriteN[?]:=SpriteN[NextSprite[?]]"
DJetzt Planebreiten:
ENow the plane widths:
DJetzt eigentliche Spritedaten einlesen:
ENow read in the real sprite data:
Djetzt den "Rest" des Sprites laden
Eload the "rest" of the sprite
Djetzt den Spriteheader vià BLOCKREAD auf den Heap laden
Eload sprite header vià BLOCKREAD into the heap
DJetzt Bresenham-Parameter berechnen
Ecompute Bresenham-parameters
Dgenug Platz reservieren
Eget enough space
Drechte untere Ecke dazu (alles virtuelle Koordinaten!)
Eaccording lower right corner (in virtual coordinates!)
Dderen zugehoergigen (virtuellen) Koordinaten
Etheir (virtual) coordinates
DKennung fuer Bilderdateien
Etag for picture files
Ddeklariert werden
Eor other sprites pixel by pixel
DDefault-Helligkeit von Schatten
Edefault brightness of shadows
Dneue Farbe darf nicht heller sein!
Enew color may not be brighter!
DFehlerquadrat berechnen
Ecompute square of error
Dbessere Approximation gefunden?
Edid we find a better approximation?
DLeseplane nach AH bringen
Eload read plane into AH
DNeuen Wert wirksam machen
Eactivate new settings
Dkeine Farbe gefunden?
Eno color found?
Dnein, also nochmal suchen
Eno, thus search again
Dtemporaere Palette mit aktuellen Farben vorbesetzen
Epreset temporary palette with actual colors
DDer fuer das Bild reservierte Heap-Speicher wurde freigegeben
Ethe heap memory allocated for the image has been released
D...nach BH
E...into BH
D...nach DH
E...into DH
D2*(DY-DX)
E2*(DY-DX)
D2*DY-DX
E2*DY-DX
Dof FOR j
Eof FOR j
DDI:=miny-maxy=-(maxy-miny)
EDI:=miny-maxy=-(maxy-miny)
DSollte dies nicht moeglich sein (oder liegt der Bildausschnitt gaenz-
EIf that is impossible (or the image is completely offscreen), the
DPAGE = aktuell dargestellte Grafikseite
EPAGE = actually displayed graphic page
DPAGESIZE = Groesse einer Bitplane
EPAGESIZE = size of one bitplane
Dstyle
Estyle
Dsteile Linie?
Esteep line?
Ddto. fuer anderes Sprite
Edto. for other sprite
Ddto., letzte Zeile
Edto., last row
DStartplane
Estartplane
Ddto., rechte untere Ecke
Edto., lower right corner
D- gleichzeitige Darstellung von bis zu 32767 Sprites (Voreinstellung: 500)
E- up to 32767 sprites may be simultaneously active (default: 500)
DSprite <>0, d.h.: ueberhaupt aktiv?
Esprite <>0, that is: sprite active?
D013C: OR AL,40 ;Bit 6:=1: Adressierung des
E013C: OR AL,40 ;bit 6:=1: address memory
Ds1,s2 = Spritepositionsnummern zweier Sprites
Es1,s2 = sprite position numbers of two sprites
DAdressen von wichtigen Werten innerhalb des Spriteheaders:
Eaddresses of important values inside the sprite header:
D0, d.h.: keine Mindestzeit fuer einen Animationszyklus
E0, that is: no min. time for animation cycle
D#29
E#29
D#249
E#249
D#239
E#239
D#229
E#229
D#219
E#219
D#209
E#209
Derste Spalte erneuern:
Eupdate first column:
DWritemode 0 wiederherstellen
Erestore write mode 0
DWritemode 1 setzen
Eset write mode 1
DGrafikmodus muss natuerlich bereits initialisiert worden sein
Egraphic mode must have been initialized already
DBreite zuerst ablegen...
Estore width first...
DGrafikseite (0..3), von der der Punkt ausgelesen
Egraphic page (0..3), from which the point shall be
DWriteMode 1 waehlen
Echoose write mode 1
DWritemode 0 setzen
Eselect write mode 0
DGrafikseite mit Hintergrundmuster fuellen
Efill graphic page with background pattern
DBreite in 4er-Gruppen
Ewidth in groups of 4
DBreite und Hoehe des gewaehlten Bereiches in Kacheln
Ewidth and height of the chosen range in tiles
Dgrundes veraendern ("Schattenfunktion")
Eimage (-> shadow function)
DCH
ECH
DBH
EBH
DAH
EAH
DDH
EDH
D2*DY
E2*DY
DRoutine trotzdem "was_cut"=FALSE!
Eroutine still returns "was_cut"=FALSE!
D34..35 DW ? ; | y1
E34..35 DW ? ; | y1
DactIndex
EactIndex
Ddto. fuer Breite und linken cutoff
Edto. for width and left cutoff
DStart-Schreibplane (Start-LESEplane=0)
E1st write plane (1st READ plane=0!)
Dx1last
Ex1last
Dx1+breite1-1 (=x1last)
Ex1+breite1-1 (=x1last)
Dy1last
Ey1last
D0133: AND AL,BF ;Bit 6:=0: keine Doppelwort-
E0133: AND AL,BF ;bit 6:=0: no double word
D0105: MOV DX,03C4 ;Sequenzer ansteuern und dort
E0105: MOV DX,03C4 ;Address sequencer and choose
Doder rightcut, denn da 320 durch 16 teilbar ist,
Eor "rightcut": because 320 is dividable by 16,
DAL=0 zugleich als Init-Wert benutzen
Euse AL=0 as starting value, too
DAL mit 0 vorbesetzen
Epreset AL with 0
D2=(3,4,1,2); 3=(4,1,2,3); zu beachten ist, dass die Breiten der einzel-
E2=(3,4,1,2); 3=(4,1,2,3); note that the widths of the bitplane tables